diff --git a/SQL/database_changelog.txt b/SQL/database_changelog.txt
index 94fd88e0c19..b16ccb2a5de 100644
--- a/SQL/database_changelog.txt
+++ b/SQL/database_changelog.txt
@@ -66,32 +66,6 @@ ALTER TABLE `messages`
ALTER TABLE `round`
ADD COLUMN `server_name` VARCHAR(32) DEFAULT NULL AFTER `end_datetime`;
-Version 5.13, 30 April 2021, by Atlanta Ned
-Added the `citation` table for tracking security citations in the database.
-
-```
-CREATE TABLE `citation` (
- `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
- `round_id` INT(11) UNSIGNED NOT NULL,
- `server_ip` INT(11) UNSIGNED NOT NULL,
- `server_port` INT(11) UNSIGNED NOT NULL,
- `citation` TEXT NOT NULL COLLATE 'utf8mb4_general_ci',
- `action` VARCHAR(20) NOT NULL DEFAULT '' COLLATE 'utf8mb4_general_ci',
- `sender` VARCHAR(32) NOT NULL DEFAULT '' COLLATE 'utf8mb4_general_ci',
- `sender_ic` VARCHAR(64) NOT NULL DEFAULT '' COMMENT 'Longer because this is the character name, not the ckey' COLLATE 'utf8mb4_general_ci',
- `recipient` VARCHAR(64) NOT NULL DEFAULT '' COMMENT 'Longer because this is the character name, not the ckey' COLLATE 'utf8mb4_general_ci',
- `crime` TEXT NOT NULL COLLATE 'utf8mb4_general_ci',
- `fine` INT(4) NULL DEFAULT NULL,
- `paid` INT(4) NULL DEFAULT '0',
- `timestamp` DATETIME NOT NULL,
- PRIMARY KEY (`id`) USING BTREE,
- UNIQUE INDEX `idx_constraints` (`round_id`, `server_ip`, `server_port`, `citation`(100)) USING BTREE
-)
-COLLATE='utf8mb4_general_ci'
-ENGINE=InnoDB
-AUTO_INCREMENT=1
-;
-```
-----------------------------------------------------
diff --git a/code/__DEFINES/~skyrat_defines/jobs.dm b/code/__DEFINES/~skyrat_defines/jobs.dm
index f8eb97ec1b8..2767d0cf576 100644
--- a/code/__DEFINES/~skyrat_defines/jobs.dm
+++ b/code/__DEFINES/~skyrat_defines/jobs.dm
@@ -2,5 +2,6 @@
#define JOB_UNAVAILABLE_SPECIES 7
#define JOB_UNAVAILABLE_LANGUAGE 7
-#define SEC_RESTRICTED_QUIRKS "Blind" = TRUE, "Brain Tumor" = TRUE, "Deaf" = TRUE, "Paraplegic" = TRUE, "Mute" = TRUE, "Foreigner" = TRUE, "Pacifist" = TRUE
-#define HEAD_RESTRICTED_QUIRKS "Blind" = TRUE, "Deaf" = TRUE, "Mute" = TRUE, "Foreigner" = TRUE
+#define SEC_RESTRICTED_QUIRKS "Blind" = TRUE, "Brain Tumor" = TRUE, "Deaf" = TRUE, "Paraplegic" = TRUE, "Mute" = TRUE, "Foreigner" = TRUE, "Pacifist" = TRUE, "Chunky Fingers" = TRUE
+#define HEAD_RESTRICTED_QUIRKS "Blind" = TRUE, "Deaf" = TRUE, "Mute" = TRUE, "Foreigner" = TRUE, "Chunky Fingers" = TRUE
+#define TECH_RESTRICTED_QUIRKS "Chunky Fingers" = TRUE
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
old mode 100755
new mode 100644
index 321288bded1..deee219a3dc
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -161,6 +161,7 @@ SUBSYSTEM_DEF(ticker)
for(var/client/C in GLOB.clients)
window_flash(C, ignorepref = TRUE) //let them know lobby has opened up.
to_chat(world, "Welcome to [station_name()]!")
+ //SKYRAT EDIT START - DISCORD SPAM PREVENTION
if(!discord_alerted)
discord_alerted = TRUE
send2chat("<@&[CONFIG_GET(string/game_alert_role_id)]> New round starting on [SSmapping.config.map_name], [CONFIG_GET(string/servername)]! \nIf you wish to be pinged for game related stuff, go to <#[CONFIG_GET(string/role_assign_channel_id)]> and assign yourself the roles.", CONFIG_GET(string/chat_announce_new_game)) // Skyrat EDIT -- role pingcurrent_state = GAME_STATE_PREGAME
diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm
index c2083d2d543..9d3d324900b 100644
--- a/code/datums/emotes.dm
+++ b/code/datums/emotes.dm
@@ -82,10 +82,10 @@
if(emote_type == EMOTE_AUDIBLE)
//SKYRAT EDIT CHANGE BEGIN
//user.audible_message(msg, audible_message_flags = EMOTE_MESSAGE) - SKYRAT EDIT - ORIGINAL
- user.audible_message(msg, deaf_message = "You see how [user] [msg]", audible_message_flags = EMOTE_MESSAGE)
+ user.audible_message(msg, deaf_message = "You see how [user] [msg]", audible_message_flags = EMOTE_MESSAGE)
else
//user.visible_message(msg, visible_message_flags = EMOTE_MESSAGE) - SKYRAT EDIT - ORIGINAL
- user.visible_message(msg, blind_message = "You hear how [user] [msg]", visible_message_flags = EMOTE_MESSAGE)
+ user.visible_message(msg, blind_message = "You hear how [user] [msg]", visible_message_flags = EMOTE_MESSAGE)
//SKYRAT EDIT CHANGE END
/// For handling emote cooldown, return true to allow the emote to happen
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index f3e5fe17deb..37adb70d944 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -178,7 +178,9 @@ GLOBAL_LIST_EMPTY(PDAs)
/obj/item/pda/update_overlays()
. = ..()
- var/mutable_appearance/overlay = new(icon)
+ if(!initial(icon))
+ return
+ var/mutable_appearance/overlay = new(initial(icon))
overlay.pixel_x = overlays_x_offset
if(id)
overlay.icon_state = "id_overlay"
diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm
index 6e44223f555..81d74039e73 100644
--- a/code/game/objects/items/devices/PDA/PDA_types.dm
+++ b/code/game/objects/items/devices/PDA/PDA_types.dm
@@ -49,6 +49,8 @@
// Special AI/pAI PDAs that cannot explode.
/obj/item/pda/ai
icon = null
+ greyscale_config = null
+ greyscale_colors = null
ttone = "data"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index effb6bbb3a9..ba259d3782d 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -21,7 +21,7 @@
new /obj/item/assembly/flash/handheld(src)
new /obj/item/clothing/glasses/meson/engine(src)
new /obj/item/door_remote/chief_engineer(src)
- new /obj/item/pipe_dispenser(src)
+ new /obj/item/pipe_dispenser/bluespace(src) // SKYRAT EDIT -- BLUESPACE RPD -- ORIGINAL: new /obj/item/pipe_dispenser(src)
new /obj/item/circuitboard/machine/techfab/department/engineering(src)
new /obj/item/extinguisher/advanced(src)
new /obj/item/storage/photo_album/ce(src)
diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm
index d2155521fe5..f17f17ab3e0 100644
--- a/code/game/objects/structures/fluff.dm
+++ b/code/game/objects/structures/fluff.dm
@@ -1,5 +1,8 @@
-//Fluff structures serve no purpose and exist only for enriching the environment. They can be destroyed with a wrench.
-
+/**
+ * # Fluff structure
+ *
+ * Fluff structures serve no purpose and exist only for enriching the environment. By default, they can be deconstructed with a wrench.
+ */
/obj/structure/fluff
name = "fluff structure"
desc = "Fluffier than a sheep. This shouldn't exist."
@@ -8,6 +11,7 @@
anchored = TRUE
density = FALSE
opacity = FALSE
+ ///If true, the structure can be deconstructed into a metal sheet with a wrench.
var/deconstructible = TRUE
/obj/structure/fluff/attackby(obj/item/I, mob/living/user, params)
@@ -21,15 +25,19 @@
qdel(src)
return
..()
-
-/obj/structure/fluff/empty_terrarium //Empty terrariums are created when a preserved terrarium in a lavaland seed vault is activated.
+/**
+ * Empty terrariums are created when a preserved terrarium in a lavaland seed vault is activated.
+ */
+/obj/structure/fluff/empty_terrarium
name = "empty terrarium"
desc = "An ancient machine that seems to be used for storing plant matter. Its hatch is ajar."
icon = 'icons/obj/lavaland/spawners.dmi'
icon_state = "terrarium_open"
density = TRUE
-
-/obj/structure/fluff/empty_sleeper //Empty sleepers are created by a good few ghost roles in lavaland.
+/**
+ * Empty sleepers are created by a good few ghost roles in lavaland.
+ */
+/obj/structure/fluff/empty_sleeper
name = "empty sleeper"
desc = "An open sleeper. It looks as though it would be awaiting another patient, were it not broken."
icon = 'icons/obj/machines/sleeper.dmi'
@@ -43,8 +51,10 @@
/obj/structure/fluff/empty_sleeper/syndicate
icon_state = "sleeper_s-open"
-
-/obj/structure/fluff/empty_cryostasis_sleeper //Empty cryostasis sleepers are created when a malfunctioning cryostasis sleeper in a lavaland shelter is activated
+/**
+ * Empty cryostasis sleepers are created when a malfunctioning cryostasis sleeper in a lavaland shelter is activated.
+ */
+/obj/structure/fluff/empty_cryostasis_sleeper
name = "empty cryostasis sleeper"
desc = "Although comfortable, this sleeper won't function as anything but a bed ever again."
icon = 'icons/obj/lavaland/spawners.dmi'
@@ -55,8 +65,10 @@
desc = "A segment of broken flooring."
icon = 'icons/obj/brokentiling.dmi'
icon_state = "corner"
-
-/obj/structure/fluff/drake_statue //Ash drake status spawn on either side of the necropolis gate in lavaland.
+/**
+ * Ash drake status spawn on either side of the necropolis gate in lavaland.
+ */
+/obj/structure/fluff/drake_statue
name = "drake statue"
desc = "A towering basalt sculpture of a proud and regal drake. Its eyes are six glowing gemstones."
icon = 'icons/effects/64x64.dmi'
@@ -65,8 +77,10 @@
density = TRUE
deconstructible = FALSE
layer = EDGED_TURF_LAYER
-
-/obj/structure/fluff/drake_statue/falling //A variety of statue in disrepair; parts are broken off and a gemstone is missing
+/**
+ * A variety of statue in disrepair; parts are broken off and a gemstone is missing
+ */
+/obj/structure/fluff/drake_statue/falling
desc = "A towering basalt sculpture of a drake. Cracks run down its surface and parts of it have fallen off."
icon_state = "drake_statue_falling"
@@ -270,8 +284,10 @@
opacity = FALSE
else
return ..()
-
-/obj/structure/fluff/hedge/opaque //useful for mazes and such
+/**
+ * useful for mazes and such
+ */
+/obj/structure/fluff/hedge/opaque
opacity = TRUE
/obj/structure/fluff/tram_rail
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_monster_antag.dm b/code/modules/antagonists/eldritch_cult/eldritch_monster_antag.dm
index c8debcd94f7..3056dbb5e82 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_monster_antag.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_monster_antag.dm
@@ -17,11 +17,11 @@
/datum/antagonist/heretic_monster/greet()
owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ecult_op.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE)//subject to change
- to_chat(owner, "You became an Eldritch Horror!")
+ to_chat(owner, "You became an Eldritch Horror!")
/datum/antagonist/heretic_monster/on_removal()
if(master)
- to_chat(master, "Your master is no longer [master.owner.current.real_name]")
+ to_chat(master, "Your master is no longer [master.owner.current.real_name]")
master = null
return ..()
@@ -33,7 +33,7 @@
master_obj.completed = TRUE
objectives += master_obj
owner.announce_objectives()
- to_chat(owner, "Your master is [master.owner.current.real_name]")
+ to_chat(owner, "Your master is [master.owner.current.real_name]")
return
/datum/antagonist/heretic_monster/apply_innate_effects(mob/living/mob_override)
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index a8e85840c19..52b66ab4444 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -104,12 +104,17 @@
var/alternative_fire_sound
///If only our alternative ammuntion misfires and not our main ammunition, we set this to TRUE
var/alternative_ammo_misfires = FALSE
+
+ /// Misfire Variables ///
+
/// Whether our ammo misfires now or when it's set by the wrench_act. TRUE means it misfires.
var/can_misfire = FALSE
///How likely is our gun to misfire?
var/misfire_probability = 0
///How much does shooting the gun increment the misfire probability?
var/misfire_percentage_increment = 0
+ ///What is the cap on our misfire probability? Do not set this to 100.
+ var/misfire_probability_cap = 25
/obj/item/gun/ballistic/Initialize()
. = ..()
@@ -358,6 +363,7 @@
/obj/item/gun/ballistic/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1)
if(can_misfire)
misfire_probability += misfire_percentage_increment
+ misfire_probability = clamp(misfire_probability, 0, misfire_probability_cap)
. = ..()
diff --git a/html/changelogs/AutoChangeLog-pr-5378.yml b/html/changelogs/AutoChangeLog-pr-5378.yml
new file mode 100644
index 00000000000..ae0d3ed0cdf
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5378.yml
@@ -0,0 +1,5 @@
+author: "Seris02"
+delete-after: True
+changes:
+ - bugfix: "various OOC messages going into unsorted now get sorted"
+ - bugfix: "various other miscellaneous unsorted messages now get sorted"
diff --git a/html/changelogs/AutoChangeLog-pr-5459.yml b/html/changelogs/AutoChangeLog-pr-5459.yml
deleted file mode 100644
index 199eb5e8061..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5459.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "many of the toggle preferences in preferences_toggles.dm going into the unsorted chat log"
- - bugfix: "many of the role greetings from sending to the wrong chat filters/ to unsorted"
- - bugfix: "miscellaneous other strings getting sent to the unsorted chat filter"
diff --git a/html/changelogs/AutoChangeLog-pr-5460.yml b/html/changelogs/AutoChangeLog-pr-5460.yml
new file mode 100644
index 00000000000..623fe6d6324
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5460.yml
@@ -0,0 +1,4 @@
+author: "unit0016"
+delete-after: True
+changes:
+ - rscadd: "Lone Infiltrators are now on the prowl."
diff --git a/html/changelogs/AutoChangeLog-pr-5472.yml b/html/changelogs/AutoChangeLog-pr-5472.yml
new file mode 100644
index 00000000000..e978293328d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5472.yml
@@ -0,0 +1,4 @@
+author: "KasparoVy"
+delete-after: True
+changes:
+ - rscadd: "Adds a new 8-point negative quirk preventing you from using most firearms, modular computers/tablets and laser pointers like an Ashwalker or Golem. KAs can be adapted w/ a modkit. You cannot be command, security, engineering, atmos, doctor, virologist, chemist, roboticist or scientist with this trait."
diff --git a/html/changelogs/AutoChangeLog-pr-5483.yml b/html/changelogs/AutoChangeLog-pr-5483.yml
new file mode 100644
index 00000000000..9f2071985b9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5483.yml
@@ -0,0 +1,5 @@
+author: "thestubborn"
+delete-after: True
+changes:
+ - rscadd: "Two new colourable coats"
+ - rscadd: "Like five new collars"
diff --git a/html/changelogs/AutoChangeLog-pr-5484.yml b/html/changelogs/AutoChangeLog-pr-5484.yml
deleted file mode 100644
index 4a199dc0484..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5484.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "sqnztb"
-delete-after: True
-changes:
- - bugfix: "icebox perma cabin has piped atmospherics again"
diff --git a/html/changelogs/AutoChangeLog-pr-5485.yml b/html/changelogs/AutoChangeLog-pr-5485.yml
deleted file mode 100644
index 4d08ae88e9b..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5485.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - imageadd: "New candle animations"
- - imageadd: "New animations for altar candles"
diff --git a/html/changelogs/AutoChangeLog-pr-5487.yml b/html/changelogs/AutoChangeLog-pr-5487.yml
deleted file mode 100644
index ccbc66f7f27..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5487.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "dogs now resist before fetching or harassing, to unbuckle from stuff if they need to"
diff --git a/html/changelogs/AutoChangeLog-pr-5490.yml b/html/changelogs/AutoChangeLog-pr-5490.yml
deleted file mode 100644
index f5ab7708690..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5490.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Celotajs"
-delete-after: True
-changes:
- - bugfix: "GAGS-generated clothing can now have proper blood splatters and damage"
diff --git a/html/changelogs/AutoChangeLog-pr-5491.yml b/html/changelogs/AutoChangeLog-pr-5491.yml
new file mode 100644
index 00000000000..b57f70de1da
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5491.yml
@@ -0,0 +1,4 @@
+author: "ZephyrTFA"
+delete-after: True
+changes:
+ - rscadd: "Bluespace RPD"
diff --git a/html/changelogs/AutoChangeLog-pr-5495.yml b/html/changelogs/AutoChangeLog-pr-5495.yml
deleted file mode 100644
index f0fdbe9c893..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5495.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - imageadd: "centers hydroponic sprays, adds new sprites for plant-b-gone"
diff --git a/html/changelogs/AutoChangeLog-pr-5499.yml b/html/changelogs/AutoChangeLog-pr-5499.yml
deleted file mode 100644
index 03bfa9a9d70..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5499.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "tf-4"
-delete-after: True
-changes:
- - bugfix: "a single space"
diff --git a/html/changelogs/AutoChangeLog-pr-5500.yml b/html/changelogs/AutoChangeLog-pr-5500.yml
deleted file mode 100644
index fa8c4ef4c52..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5500.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "tf-4"
-delete-after: True
-changes:
- - bugfix: "the sec medic and HoP now get four mags in their gunsets, same as everyone else"
diff --git a/html/changelogs/AutoChangeLog-pr-5501.yml b/html/changelogs/AutoChangeLog-pr-5501.yml
deleted file mode 100644
index aa09d826c91..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5501.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "The cursed slot machine sprite in the Greed lavaland ruin is now slightly less cursed."
diff --git a/html/changelogs/AutoChangeLog-pr-5506.yml b/html/changelogs/AutoChangeLog-pr-5506.yml
deleted file mode 100644
index 251836d767e..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5506.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - rscadd: "BBQ Sauce can now be ordered in the kitchen console."
diff --git a/html/changelogs/AutoChangeLog-pr-5507.yml b/html/changelogs/AutoChangeLog-pr-5507.yml
deleted file mode 100644
index 3be4f9bd263..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5507.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SparkezelPL"
-delete-after: True
-changes:
- - bugfix: "Single tank bombs no longer just delete themselves"
diff --git a/html/changelogs/AutoChangeLog-pr-5508.yml b/html/changelogs/AutoChangeLog-pr-5508.yml
deleted file mode 100644
index f0741371492..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5508.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "Syndicate uplink types can now be changed again"
- - bugfix: "Radio uplink frequencies are now random again"
diff --git a/html/changelogs/AutoChangeLog-pr-5509.yml b/html/changelogs/AutoChangeLog-pr-5509.yml
deleted file mode 100644
index bc02ddf9397..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5509.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "spammable logging in chem grenades"
diff --git a/html/changelogs/AutoChangeLog-pr-5510.yml b/html/changelogs/AutoChangeLog-pr-5510.yml
deleted file mode 100644
index fafca1aca4e..00000000000
--- a/html/changelogs/AutoChangeLog-pr-5510.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "fixed buggy organ fridges repair rate"
- - bugfix: "fixed upgraded organ fridges not repairing organs"
diff --git a/html/changelogs/AutoChangeLog-pr-5513.yml b/html/changelogs/AutoChangeLog-pr-5513.yml
new file mode 100644
index 00000000000..b286663bb13
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5513.yml
@@ -0,0 +1,4 @@
+author: "ORCACommander"
+delete-after: True
+changes:
+ - bugfix: "Cleaned up the SQL Changelog AGAIN"
diff --git a/html/changelogs/AutoChangeLog-pr-5515.yml b/html/changelogs/AutoChangeLog-pr-5515.yml
new file mode 100644
index 00000000000..b674da76fb8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5515.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "Messages related to becoming and ceasing to be a heretic monster are now more noticeable."
diff --git a/html/changelogs/AutoChangeLog-pr-5516.yml b/html/changelogs/AutoChangeLog-pr-5516.yml
new file mode 100644
index 00000000000..260fc0ae339
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5516.yml
@@ -0,0 +1,4 @@
+author: "Celotajs"
+delete-after: True
+changes:
+ - bugfix: "Fixed PDA overlays for GAGS PDAs"
diff --git a/html/changelogs/archive/2021-05.yml b/html/changelogs/archive/2021-05.yml
index a87dcd43272..d570e0952d1 100644
--- a/html/changelogs/archive/2021-05.yml
+++ b/html/changelogs/archive/2021-05.yml
@@ -245,3 +245,34 @@
unit0016:
- balance: The most involved balance change ever - NSS Journey's turf decals have
been changed up a lot. Also the aux base is a bit different, I suppose.
+2021-05-07:
+ Celotajs:
+ - bugfix: GAGS-generated clothing can now have proper blood splatters and damage
+ SkyratBot:
+ - bugfix: dogs now resist before fetching or harassing, to unbuckle from stuff if
+ they need to
+ - bugfix: spammable logging in chem grenades
+ - bugfix: Syndicate uplink types can now be changed again
+ - bugfix: Radio uplink frequencies are now random again
+ - imageadd: New candle animations
+ - imageadd: New animations for altar candles
+ - bugfix: many of the toggle preferences in preferences_toggles.dm going into the
+ unsorted chat log
+ - bugfix: many of the role greetings from sending to the wrong chat filters/ to
+ unsorted
+ - bugfix: miscellaneous other strings getting sent to the unsorted chat filter
+ - bugfix: fixed buggy organ fridges repair rate
+ - bugfix: fixed upgraded organ fridges not repairing organs
+ - rscadd: BBQ Sauce can now be ordered in the kitchen console.
+ - bugfix: The cursed slot machine sprite in the Greed lavaland ruin is now slightly
+ less cursed.
+ - bugfix: Prevents guns that can misfire reaching 100% probability.
+ - imageadd: centers hydroponic sprays, adds new sprites for plant-b-gone
+ SparkezelPL:
+ - bugfix: Single tank bombs no longer just delete themselves
+ sqnztb:
+ - bugfix: icebox perma cabin has piped atmospherics again
+ tf-4:
+ - bugfix: the sec medic and HoP now get four mags in their gunsets, same as everyone
+ else
+ - bugfix: a single space
diff --git a/modular_skyrat/master_files/code/datums/traits/negative.dm b/modular_skyrat/master_files/code/datums/traits/negative.dm
index 042ea9b9410..862e76011dc 100644
--- a/modular_skyrat/master_files/code/datums/traits/negative.dm
+++ b/modular_skyrat/master_files/code/datums/traits/negative.dm
@@ -33,3 +33,12 @@
. = ..()
var/mob/living/carbon/human/H = quirk_holder
H?.cure_trauma_type(/datum/brain_trauma/severe/monophobia, TRAUMA_RESILIENCE_ABSOLUTE)
+
+/datum/quirk/ashwalkertalons
+ name = "Chunky Fingers"
+ desc = "Your digits are thick and tough and unable to use modular computers including tablets, certain devices like laser pointers, and non-adapted firearms."
+ gain_text = "Your fingers feel thicker and slightly less dextrous. You expect you'll have a difficult time using computers, certain small devices and firearms."
+ lose_text = "Your digits feel lithe and capable once more."
+ medical_record_text = "Patient's digits are thick and lack the dexterity for operating some small devices, computers and non-adapted firearms."
+ value = -8
+ mob_trait = TRAIT_CHUNKYFINGERS
diff --git a/modular_skyrat/modules/Midroundtraitor/datum_traitor.dm b/modular_skyrat/modules/Midroundtraitor/datum_traitor.dm
new file mode 100644
index 00000000000..aeb51037109
--- /dev/null
+++ b/modular_skyrat/modules/Midroundtraitor/datum_traitor.dm
@@ -0,0 +1,10 @@
+/datum/antagonist/traitor/infiltrator
+ name = "Infiltrator"
+ var/infil_outfit = /datum/outfit/syndicateinfiltrator
+
+/datum/antagonist/traitor/infiltrator/on_gain()
+ var/mob/living/carbon/human/H = owner.current
+ H.equipOutfit(infil_outfit)
+ var/chosen_name = H.dna.species.random_name(H.gender,1,1)
+ H.fully_replace_character_name(H.real_name,chosen_name)
+ return ..()
diff --git a/modular_skyrat/modules/Midroundtraitor/event.dm b/modular_skyrat/modules/Midroundtraitor/event.dm
new file mode 100644
index 00000000000..fc41acccd73
--- /dev/null
+++ b/modular_skyrat/modules/Midroundtraitor/event.dm
@@ -0,0 +1,64 @@
+/datum/dynamic_ruleset/midround/from_ghosts/lone_infiltrator
+ name = "Lone Infiltrator"
+ antag_datum = /datum/antagonist/traitor/infiltrator
+ antag_flag = ROLE_TRAITOR
+ restricted_roles = list("Cyborg", "AI", "Positronic Brain")
+ required_candidates = 1
+ weight = 5 //Slightly less common than normal midround traitors.
+ cost = 15 //But also slightly more costly.
+ requirements = list(50,40,30,20,10,10,10,10,10,10)
+ var/list/spawn_locs = list()
+
+/datum/dynamic_ruleset/midround/from_ghosts/lone_infiltrator/execute()
+ for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list)
+ spawn_locs += (C.loc)
+ if(!spawn_locs.len)
+ message_admins("No valid spawn locations found, aborting...")
+ return MAP_ERROR
+ . = ..()
+
+/datum/dynamic_ruleset/midround/from_ghosts/lone_infiltrator/generate_ruleset_body(mob/applicant)
+ var/datum/mind/player_mind = new /datum/mind(applicant.key)
+
+ var/mob/living/carbon/human/operative = new(pick(spawn_locs))
+ applicant.client.prefs.copy_to(operative)
+ operative.dna.update_dna_identity()
+ operative.dna.species.before_equip_job(null, operative)
+ operative.regenerate_icons()
+ SSquirks.AssignQuirks(operative, applicant.client, TRUE, TRUE, null, FALSE, operative)
+ player_mind.assigned_role = "Lone Infiltrator"
+ player_mind.special_role = "Lone Infiltrator"
+ player_mind.active = TRUE
+ player_mind.transfer_to(operative)
+ player_mind.add_antag_datum(/datum/antagonist/traitor/infiltrator)
+
+ message_admins("[ADMIN_LOOKUPFLW(operative)] has been made into lone infiltrator by midround ruleset.")
+ log_game("[key_name(operative)] was spawned as a lone infiltrator by midround ruleset.")
+ return operative
+
+//OUTFIT//
+/datum/outfit/syndicateinfiltrator
+ name = "Syndicate Operative - Infiltrator"
+
+ uniform = /obj/item/clothing/under/syndicate
+ shoes = /obj/item/clothing/shoes/combat
+ gloves = /obj/item/clothing/gloves/combat
+ back = /obj/item/storage/backpack/fireproof
+ ears = /obj/item/radio/headset/syndicate/alt
+ id = /obj/item/card/id/advanced/chameleon
+ glasses = /obj/item/clothing/glasses/night
+ mask = /obj/item/clothing/mask/gas/syndicate
+ suit = /obj/item/clothing/suit/space/hardsuit/syndi
+ r_pocket = /obj/item/tank/internals/emergency_oxygen/engi
+ internals_slot = ITEM_SLOT_RPOCKET
+ belt = /obj/item/storage/belt/military
+ backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\
+ /obj/item/tank/jetpack/oxygen/harness=1,\
+ /obj/item/gun/ballistic/automatic/pistol=1,\
+ /obj/item/kitchen/knife/combat/survival)
+
+ id_trim = /datum/id_trim/chameleon/operative
+
+/datum/outfit/syndicateinfiltrator/post_equip(mob/living/carbon/human/H)
+ H.faction |= ROLE_SYNDICATE
+ H.update_icons()
diff --git a/modular_skyrat/modules/admin/code/aooc.dm b/modular_skyrat/modules/admin/code/aooc.dm
index d5e3ed7c4a5..f4948c3d31d 100644
--- a/modular_skyrat/modules/admin/code/aooc.dm
+++ b/modular_skyrat/modules/admin/code/aooc.dm
@@ -75,7 +75,7 @@ GLOBAL_LIST_EMPTY(ckey_to_aooc_name)
var/mode = listeners[c]
var/color = (!anon && CONFIG_GET(flag/allow_admin_ooccolor) && C.prefs.ooccolor) ? C.prefs.ooccolor : GLOB.AOOC_COLOR
var/name = (mode == AOOC_LISTEN_ADMIN && anon) ? "([key])[keyname]" : keyname
- to_chat(C, "AOOC: [name]: [msg]")
+ to_chat(C, "AOOC: [name]: [msg]")
#undef AOOC_LISTEN_PLAYER
#undef AOOC_LISTEN_ADMIN
@@ -101,7 +101,7 @@ GLOBAL_LIST_EMPTY(ckey_to_aooc_name)
listeners[M.client] = TRUE
for(var/c in listeners)
var/client/C = c
- to_chat(C, "The AOOC channel has been globally [GLOB.aooc_allowed ? "enabled" : "disabled"].")
+ to_chat(C, "The AOOC channel has been globally [GLOB.aooc_allowed ? "enabled" : "disabled"].")
/datum/admins/proc/toggleaooc()
set category = "Server"
diff --git a/modular_skyrat/modules/admin/code/sooc.dm b/modular_skyrat/modules/admin/code/sooc.dm
index adabbf95378..016050087a9 100644
--- a/modular_skyrat/modules/admin/code/sooc.dm
+++ b/modular_skyrat/modules/admin/code/sooc.dm
@@ -75,7 +75,7 @@ GLOBAL_LIST_EMPTY(ckey_to_sooc_name)
var/mode = listeners[c]
var/color = (!anon && CONFIG_GET(flag/allow_admin_ooccolor) && C.prefs.ooccolor) ? C.prefs.ooccolor : GLOB.SOOC_COLOR
var/name = (mode == SOOC_LISTEN_ADMIN && anon) ? "([key])[keyname]" : keyname
- to_chat(C, "SOOC: [name]: [msg]")
+ to_chat(C, "SOOC: [name]: [msg]")
#undef SOOC_LISTEN_PLAYER
#undef SOOC_LISTEN_ADMIN
@@ -101,7 +101,7 @@ GLOBAL_LIST_EMPTY(ckey_to_sooc_name)
listeners[M.client] = TRUE
for(var/c in listeners)
var/client/C = c
- to_chat(C, "The SOOC channel has been globally [GLOB.sooc_allowed ? "enabled" : "disabled"].")
+ to_chat(C, "The SOOC channel has been globally [GLOB.sooc_allowed ? "enabled" : "disabled"].")
/datum/admins/proc/togglesooc()
set category = "Server"
diff --git a/modular_skyrat/modules/bsrpd/code/bsrpd.dm b/modular_skyrat/modules/bsrpd/code/bsrpd.dm
new file mode 100644
index 00000000000..9fb0016cd8f
--- /dev/null
+++ b/modular_skyrat/modules/bsrpd/code/bsrpd.dm
@@ -0,0 +1,64 @@
+#define BSRPD_CAPAC_MAX 500
+#define BSRPD_CAPAC_USE 10
+#define BSRPD_CAPAC_NEW 250
+
+/obj/item/pipe_dispenser/bluespace
+ name = "Bluespace RPD"
+ desc = "State of the art technology being tested by NT scientists; this is their only working prototype."
+ icon = 'modular_skyrat/modules/bsrpd/icons/bsrpd.dmi'
+ icon_state = "bsrpd"
+ lefthand_file = 'modular_skyrat/modules/bsrpd/icons/bsrpd_left.dmi'
+ righthand_file = 'modular_skyrat/modules/bsrpd/icons/bsrpd_right.dmi'
+ inhand_icon_state = "bsrpd"
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ custom_materials = null
+ var/bs_capac = BSRPD_CAPAC_MAX
+ var/bs_use = BSRPD_CAPAC_USE
+ var/bs_prog = 0
+
+/obj/item/pipe_dispenser/bluespace/attackby(obj/item/item, mob/user, param)
+ if(istype(item, /obj/item/stack/sheet/bluespace_crystal))
+ if(BSRPD_CAPAC_NEW > (BSRPD_CAPAC_MAX - bs_capac) || bs_use == 0)
+ to_chat(user, "You cannot recharge [src] anymore!")
+ return
+ item.use(1)
+ to_chat(user, "You recharge the bluespace capacitor inside of [src]")
+ bs_capac += BSRPD_CAPAC_NEW
+ return
+ if(istype(item, /obj/item/assembly/signaler/anomaly/bluespace))
+ if(bs_use)
+ to_chat(user, "You slot [item] into [src]; supercharging the bluespace capacitor!")
+ bs_use = 0
+ qdel(item)
+ else
+ to_chat(user, "You cannot improve the [src] further.")
+ return
+ return ..()
+
+/obj/item/pipe_dispenser/bluespace/examine(mob/user)
+ . = ..()
+ if(user.Adjacent(src))
+ . += "Currently has [bs_use == 0 ? "infinite" : bs_capac / bs_use] charges remaining."
+ if(bs_use != 0)
+ . += "The Bluespace Anomaly Core slot is empty."
+ else
+ . += "You cannot see the charge capacity."
+
+/obj/item/pipe_dispenser/bluespace/afterattack(atom/target, mob/user, prox)
+ if(prox) // If we are in proximity to the target, don't use charge and don't call this shitcode.
+ return ..()
+ if(bs_capac < (bs_use * (bs_prog + 1)))
+ to_chat(user, "The [src] lacks the charge to do that.")
+ return FALSE
+ bs_prog++ // So people can't just spam click and get more uses
+ user.Beam(target, icon_state = "rped_upgrade", time = 1 SECONDS)
+ if(pre_attack(target, user))
+ bs_prog--
+ bs_capac -= bs_use
+ return TRUE
+ bs_prog--
+ return FALSE
+
+#undef BSRPD_CAPAC_MAX
+#undef BSRPD_CAPAC_USE
+#undef BSRPD_CAPAC_NEW
diff --git a/modular_skyrat/modules/bsrpd/icons/bsrpd.dmi b/modular_skyrat/modules/bsrpd/icons/bsrpd.dmi
new file mode 100644
index 00000000000..5785e4d369a
Binary files /dev/null and b/modular_skyrat/modules/bsrpd/icons/bsrpd.dmi differ
diff --git a/modular_skyrat/modules/bsrpd/icons/bsrpd_left.dmi b/modular_skyrat/modules/bsrpd/icons/bsrpd_left.dmi
new file mode 100644
index 00000000000..7ade04f94ef
Binary files /dev/null and b/modular_skyrat/modules/bsrpd/icons/bsrpd_left.dmi differ
diff --git a/modular_skyrat/modules/bsrpd/icons/bsrpd_right.dmi b/modular_skyrat/modules/bsrpd/icons/bsrpd_right.dmi
new file mode 100644
index 00000000000..a55b1659d6f
Binary files /dev/null and b/modular_skyrat/modules/bsrpd/icons/bsrpd_right.dmi differ
diff --git a/modular_skyrat/modules/combat_indicator/code/combat_indicator.dm b/modular_skyrat/modules/combat_indicator/code/combat_indicator.dm
index d2edccab722..c05dcfabbc8 100644
--- a/modular_skyrat/modules/combat_indicator/code/combat_indicator.dm
+++ b/modular_skyrat/modules/combat_indicator/code/combat_indicator.dm
@@ -30,7 +30,7 @@ GLOBAL_VAR_INIT(combat_indicator_overlay, GenerateCombatOverlay())
nextcombatpopup = world.time + COMBAT_NOTICE_COOLDOWN
playsound(src, 'sound/machines/chime.ogg', 10, ignore_walls = FALSE)
flick_emote_popup_on_mob("combat", 20)
- visible_message("[src] gets ready for combat!")
+ visible_message("[src] gets ready for combat!")
add_overlay(GLOB.combat_indicator_overlay)
combat_indicator = TRUE
src.log_message("has turned ON the combat indicator!", INDIVIDUAL_ATTACK_LOG)
diff --git a/modular_skyrat/modules/customization/icons/mob/clothing/neck.dmi b/modular_skyrat/modules/customization/icons/mob/clothing/neck.dmi
index da5e65c9d4a..801575fe28b 100644
Binary files a/modular_skyrat/modules/customization/icons/mob/clothing/neck.dmi and b/modular_skyrat/modules/customization/icons/mob/clothing/neck.dmi differ
diff --git a/modular_skyrat/modules/customization/icons/mob/clothing/suit.dmi b/modular_skyrat/modules/customization/icons/mob/clothing/suit.dmi
index 99e05acea4b..979c1fc7d1d 100644
Binary files a/modular_skyrat/modules/customization/icons/mob/clothing/suit.dmi and b/modular_skyrat/modules/customization/icons/mob/clothing/suit.dmi differ
diff --git a/modular_skyrat/modules/customization/icons/mob/clothing/uniform.dmi b/modular_skyrat/modules/customization/icons/mob/clothing/uniform.dmi
index ca82a6ffccb..04d314b1ed0 100644
Binary files a/modular_skyrat/modules/customization/icons/mob/clothing/uniform.dmi and b/modular_skyrat/modules/customization/icons/mob/clothing/uniform.dmi differ
diff --git a/modular_skyrat/modules/customization/icons/obj/clothing/neck.dmi b/modular_skyrat/modules/customization/icons/obj/clothing/neck.dmi
index d90044d2956..ab482c1d827 100644
Binary files a/modular_skyrat/modules/customization/icons/obj/clothing/neck.dmi and b/modular_skyrat/modules/customization/icons/obj/clothing/neck.dmi differ
diff --git a/modular_skyrat/modules/customization/icons/obj/clothing/suits.dmi b/modular_skyrat/modules/customization/icons/obj/clothing/suits.dmi
index 15bba73aa16..e89a4c866c0 100644
Binary files a/modular_skyrat/modules/customization/icons/obj/clothing/suits.dmi and b/modular_skyrat/modules/customization/icons/obj/clothing/suits.dmi differ
diff --git a/modular_skyrat/modules/customization/icons/obj/clothing/uniforms.dmi b/modular_skyrat/modules/customization/icons/obj/clothing/uniforms.dmi
index 9de08554aa3..79f67bd518e 100644
Binary files a/modular_skyrat/modules/customization/icons/obj/clothing/uniforms.dmi and b/modular_skyrat/modules/customization/icons/obj/clothing/uniforms.dmi differ
diff --git a/modular_skyrat/modules/customization/modules/client/loadout/donator/personal/donator_personal.dm b/modular_skyrat/modules/customization/modules/client/loadout/donator/personal/donator_personal.dm
index 4f9e0bd69e8..e6d98976da3 100644
--- a/modular_skyrat/modules/customization/modules/client/loadout/donator/personal/donator_personal.dm
+++ b/modular_skyrat/modules/customization/modules/client/loadout/donator/personal/donator_personal.dm
@@ -193,4 +193,4 @@
/datum/loadout_item/backpack/donator/intern_hat
name = "Intern Hat"
path = /obj/item/clothing/head/intern/developer
- ckeywhitelist = list("gandalf2k15", "yawet330", "junglerat", "theooz", "tf4", "cheshify", "swiftfeather", "spcr", "tygertac", "useroth")
+ ckeywhitelist = list("gandalf2k15", "yawet330", "junglerat", "theooz", "tf4", "cheshify", "swiftfeather", "spcr", "tygertac", "useroth", "slippyjoe")
diff --git a/modular_skyrat/modules/customization/modules/client/loadout/neck.dm b/modular_skyrat/modules/customization/modules/client/loadout/neck.dm
index b98721a7c17..0619f48ea7f 100644
--- a/modular_skyrat/modules/customization/modules/client/loadout/neck.dm
+++ b/modular_skyrat/modules/customization/modules/client/loadout/neck.dm
@@ -21,6 +21,26 @@
path = /obj/item/clothing/neck/human_petcollar/leather
extra_info = LOADOUT_INFO_THREE_COLORS
+/datum/loadout_item/neck/cbellcollar
+ name = "Cowbell collar"
+ path = /obj/item/clothing/neck/human_petcollar/locked/cowcollar
+
+/datum/loadout_item/neck/bellcollar
+ name = "Bell collar"
+ path = /obj/item/clothing/neck/human_petcollar/locked/bellcollar
+
+/datum/loadout_item/neck/spikecollar
+ name = "Spike collar"
+ path = /obj/item/clothing/neck/human_petcollar/locked/spikecollar
+
+/datum/loadout_item/neck/hcollar
+ name = "Holocollar"
+ path = /obj/item/clothing/neck/human_petcollar/locked/holocollar
+
+/datum/loadout_item/neck/crosscollar
+ name = "Cross collar"
+ path = /obj/item/clothing/neck/human_petcollar/locked/cross
+
/datum/loadout_item/neck/poly_cloak
name = "Polychromic Cloak"
path = /obj/item/clothing/neck/cloak/polychromic
diff --git a/modular_skyrat/modules/customization/modules/client/loadout/suit.dm b/modular_skyrat/modules/customization/modules/client/loadout/suit.dm
index 1cab197e87b..e7212a0c9b7 100644
--- a/modular_skyrat/modules/customization/modules/client/loadout/suit.dm
+++ b/modular_skyrat/modules/customization/modules/client/loadout/suit.dm
@@ -36,6 +36,16 @@
name = "Tailcoat"
path = /obj/item/clothing/suit/costume/tailcoat
+/datum/loadout_item/suit/duster
+ name = "Colorable Duster"
+ path = /obj/item/clothing/suit/duster/colorable
+ extra_info = LOADOUT_INFO_ONE_COLOR
+
+/datum/loadout_item/suit/peacoat
+ name = "Colorable Peacoat"
+ path = /obj/item/clothing/suit/toggle/peacoat
+ extra_info = LOADOUT_INFO_ONE_COLOR
+
/datum/loadout_item/suit/dresscoat
name = "Black Dresscoat"
path = /obj/item/clothing/suit/costume/vic_dresscoat
diff --git a/modular_skyrat/modules/customization/modules/client/loadout/uniform.dm b/modular_skyrat/modules/customization/modules/client/loadout/uniform.dm
index 32e8ad5b0d7..0a8cd1ce22c 100644
--- a/modular_skyrat/modules/customization/modules/client/loadout/uniform.dm
+++ b/modular_skyrat/modules/customization/modules/client/loadout/uniform.dm
@@ -2,6 +2,11 @@
category = LOADOUT_CATEGORY_UNIFORM
//MISC
+/datum/loadout_item/uniform/gandalf
+ name = "Nostalgic Costume"
+ path = /obj/item/clothing/under/nostalgiacritic
+ ckeywhitelist = list("gandalf2k15")
+
/datum/loadout_item/uniform/assistantformal
name = "Assistant's formal uniform"
path = /obj/item/clothing/under/misc/assistantformal
diff --git a/modular_skyrat/modules/customization/modules/clothing/neck/collars.dm b/modular_skyrat/modules/customization/modules/clothing/neck/collars.dm
index 2d54b50de91..56bb98d21d1 100644
--- a/modular_skyrat/modules/customization/modules/clothing/neck/collars.dm
+++ b/modular_skyrat/modules/customization/modules/clothing/neck/collars.dm
@@ -90,3 +90,42 @@
/obj/item/key/collar
name = "Collar Key"
desc = "A key for a tiny lock on a collar or bag."
+
+/obj/item/clothing/neck/human_petcollar/locked/cowcollar
+ icon = 'modular_skyrat/modules/customization/icons/obj/clothing/neck.dmi'
+ worn_icon = 'modular_skyrat/modules/customization/icons/mob/clothing/neck.dmi'
+ name = "cowbell collar"
+ desc = "Don't fear the ripper, now your pet doesn't have to."
+ icon_state = "collar_cowbell"
+
+/obj/item/clothing/neck/human_petcollar/locked/bellcollar
+ icon = 'modular_skyrat/modules/customization/icons/obj/clothing/neck.dmi'
+ worn_icon = 'modular_skyrat/modules/customization/icons/mob/clothing/neck.dmi'
+ name = "bell collar"
+ desc = "A loud and annoying collar for your little kittens!"
+ icon_state = "collar_bell"
+
+/obj/item/clothing/neck/human_petcollar/locked/spikecollar
+ icon = 'modular_skyrat/modules/customization/icons/obj/clothing/neck.dmi'
+ worn_icon = 'modular_skyrat/modules/customization/icons/mob/clothing/neck.dmi'
+ name = "spiked collar"
+ desc = "A collar for moody pets. Or pitbulls."
+ icon_state = "collar_spik"
+
+/obj/item/clothing/neck/human_petcollar/locked/holocollar
+ icon = 'modular_skyrat/modules/customization/icons/obj/clothing/neck.dmi'
+ worn_icon = 'modular_skyrat/modules/customization/icons/mob/clothing/neck.dmi'
+ name = "holocollar"
+ desc = "A collar with holographic information, like a microchip, but around the neck."
+ icon_state = "collar_holo"
+
+/obj/item/clothing/neck/human_petcollar/locked/cross
+ icon = 'modular_skyrat/modules/customization/icons/obj/clothing/neck.dmi'
+ worn_icon = 'modular_skyrat/modules/customization/icons/mob/clothing/neck.dmi'
+ name = "cross collar"
+ desc = "A religious punishment, probably."
+ icon_state = "collar_blk"
+
+
+
+
diff --git a/modular_skyrat/modules/customization/modules/clothing/suits/coats.dm b/modular_skyrat/modules/customization/modules/clothing/suits/coats.dm
index e4792edb24a..0184f7d049d 100644
--- a/modular_skyrat/modules/customization/modules/clothing/suits/coats.dm
+++ b/modular_skyrat/modules/customization/modules/clothing/suits/coats.dm
@@ -230,3 +230,30 @@
mutant_variants = NONE
+/obj/item/clothing/suit/duster/colorable
+ name = "colorable duster"
+ desc = "This station aint big enough for the both of us."
+ icon = 'modular_skyrat/modules/customization/icons/obj/clothing/suits.dmi'
+ worn_icon = 'modular_skyrat/modules/customization/icons/mob/clothing/suit.dmi'
+ icon_state = "duster"
+ mutant_variants = NONE
+
+/obj/item/clothing/suit/duster/colorable/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/polychromic, list("5D5"))
+
+/obj/item/clothing/suit/toggle/peacoat
+ name = "colorable peacoat"
+ desc = "The way you guys are blending in with the local colour. I mean, Flag Girl was bad enough, but U-Boat Captain?"
+ icon = 'modular_skyrat/modules/customization/icons/obj/clothing/suits.dmi'
+ worn_icon = 'modular_skyrat/modules/customization/icons/mob/clothing/suit.dmi'
+ icon_state = "peacoat"
+ mutant_variants = NONE
+
+/obj/item/clothing/suit/toggle/peacoat/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/polychromic, list("5D5"))
+
+
+
+
diff --git a/modular_skyrat/modules/customization/modules/clothing/under/misc.dm b/modular_skyrat/modules/customization/modules/clothing/under/misc.dm
index c46056c655f..9d750f4e19b 100644
--- a/modular_skyrat/modules/customization/modules/clothing/under/misc.dm
+++ b/modular_skyrat/modules/customization/modules/clothing/under/misc.dm
@@ -394,5 +394,12 @@
worn_icon = 'modular_skyrat/modules/customization/icons/mob/clothing/uniform.dmi'
icon_state = "rusuni"
+/obj/item/clothing/under/nostalgiacritic
+ name = "nostalgic outfit"
+ desc = "He remembers it so you don't have to."
+ icon = 'modular_skyrat/modules/customization/icons/obj/clothing/uniforms.dmi'
+ worn_icon = 'modular_skyrat/modules/customization/icons/mob/clothing/uniform.dmi'
+ icon_state = "cia"
+
diff --git a/modular_skyrat/modules/customization/modules/clothing/under/security.dm b/modular_skyrat/modules/customization/modules/clothing/under/security.dm
index 833c0a97f17..7936900ad8e 100644
--- a/modular_skyrat/modules/customization/modules/clothing/under/security.dm
+++ b/modular_skyrat/modules/customization/modules/clothing/under/security.dm
@@ -155,6 +155,10 @@
icon = 'modular_skyrat/modules/customization/icons/obj/clothing/uniforms.dmi'
worn_icon = 'modular_skyrat/modules/customization/icons/mob/clothing/uniform.dmi'
icon_state = "prisonerclassic"
+ body_parts_covered = CHEST|GROIN|ARMS|LEGS
+ has_sensor = LOCKED_SENSORS
+ sensor_mode = SENSOR_COORDS
+ random_sensor = FALSE
///CDO
/obj/item/clothing/under/rank/security/peacekeeper/junior/sol
diff --git a/modular_skyrat/modules/customization/modules/jobs/_job.dm b/modular_skyrat/modules/customization/modules/jobs/_job.dm
index ae746c92394..b97e6579de5 100644
--- a/modular_skyrat/modules/customization/modules/jobs/_job.dm
+++ b/modular_skyrat/modules/customization/modules/jobs/_job.dm
@@ -11,7 +11,7 @@
var/list/species_whitelist
//Blacklist of species for this job.
var/list/species_blacklist
- /// Which languages does the job require, associative to LANGUAGE_UNDERSTOOD or LANGUAGE_SPOKEN
+ /// Which languages does the job require, associative to LANGUAGE_UNDERSTOOD or LANGUAGE_SPOKEN
var/list/required_languages = list(/datum/language/common = LANGUAGE_SPOKEN)
/datum/job/proc/has_banned_quirk(datum/preferences/pref)
@@ -49,7 +49,7 @@
/datum/job/security_sergeant
banned_quirks = list(SEC_RESTRICTED_QUIRKS)
-
+
/datum/job/security_medic
banned_quirks = list(SEC_RESTRICTED_QUIRKS)
@@ -101,6 +101,27 @@
/datum/job/prisoner
required_languages = null
+/datum/job/station_engineer
+ banned_quirks = list(TECH_RESTRICTED_QUIRKS)
+
+/datum/job/atmospheric_technician
+ banned_quirks = list(TECH_RESTRICTED_QUIRKS)
+
+/datum/job/doctor
+ banned_quirks = list(TECH_RESTRICTED_QUIRKS)
+
+/datum/job/virologist
+ banned_quirks = list(TECH_RESTRICTED_QUIRKS)
+
+/datum/job/chemist
+ banned_quirks = list(TECH_RESTRICTED_QUIRKS)
+
+/datum/job/roboticist
+ banned_quirks = list(TECH_RESTRICTED_QUIRKS)
+
+/datum/job/scientist
+ banned_quirks = list(TECH_RESTRICTED_QUIRKS)
+
/datum/job/proc/has_required_languages(datum/preferences/pref)
if(!required_languages)
return TRUE
diff --git a/modular_skyrat/modules/ghostcafe/code/game/objects/structures/ghost_role_spawners.dm b/modular_skyrat/modules/ghostcafe/code/game/objects/structures/ghost_role_spawners.dm
index 08568c4328f..91208c41cd3 100644
--- a/modular_skyrat/modules/ghostcafe/code/game/objects/structures/ghost_role_spawners.dm
+++ b/modular_skyrat/modules/ghostcafe/code/game/objects/structures/ghost_role_spawners.dm
@@ -34,7 +34,7 @@
/area/centcom/holding/cafebuild, /area/centcom/holding/cafevox, /area/centcom/holding/cafedorms, /area/centcom/holding/cafepark, /area/centcom/holding/cafeplumbing))
ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, GHOSTROLE_TRAIT)
ADD_TRAIT(new_spawn, TRAIT_FREE_GHOST, GHOSTROLE_TRAIT)
- to_chat(new_spawn,"Ghosting is free!")
+ to_chat(new_spawn,"Ghosting is free!")
var/datum/action/toggle_dead_chat_mob/D = new(new_spawn)
D.Grant(new_spawn)
@@ -64,7 +64,7 @@
/area/centcom/holding/cafebuild, /area/centcom/holding/cafevox, /area/centcom/holding/cafedorms, /area/centcom/holding/cafepark, /area/centcom/holding/cafeplumbing))
ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, GHOSTROLE_TRAIT)
ADD_TRAIT(new_spawn, TRAIT_FREE_GHOST, GHOSTROLE_TRAIT)
- to_chat(new_spawn,"Ghosting is free!")
+ to_chat(new_spawn,"Ghosting is free!")
//to_chat(new_spawn,"Be warned: People who opt out of EORG will come here. Do not make the area uninhabitable and do NOT commit EORG. This is a safe-zone. If you attack people in EORG, you will be banned for griefing.")
var/datum/action/toggle_dead_chat_mob/D = new(new_spawn)
D.Grant(new_spawn)
diff --git a/modular_skyrat/modules/gunpoint/code/datum/gunpoint/gunpoint_datum.dm b/modular_skyrat/modules/gunpoint/code/datum/gunpoint/gunpoint_datum.dm
index e702e801257..b914d7b91e6 100644
--- a/modular_skyrat/modules/gunpoint/code/datum/gunpoint/gunpoint_datum.dm
+++ b/modular_skyrat/modules/gunpoint/code/datum/gunpoint/gunpoint_datum.dm
@@ -92,8 +92,8 @@
locked = TRUE
log_combat(target, source, "locked onto with aiming")
playsound(get_turf(source), 'modular_skyrat/modules/gunpoint/sound/targeton.ogg', 50,1)
- to_chat(source, "You lock onto [target.name]!")
- target.visible_message("[source.name] holds [target.name] at gunpoint with the [aimed_gun.name]!", "[source.name] holds you at gunpoint with the [aimed_gun.name]!")
+ to_chat(source, "You lock onto [target.name]!")
+ target.visible_message("[source.name] holds [target.name] at gunpoint with the [aimed_gun.name]!", "[source.name] holds you at gunpoint with the [aimed_gun.name]!")
if(target.gunpointed.len == 1)//First case
to_chat(target, "You'll get shot if you use radio, move or interact with items!")
to_chat(target, "You can however take items out, toss harmless items or drop them.")
@@ -131,7 +131,7 @@
source.gunpointing = null
if(locked)
QDEL_NULL(gunpoint_gui)
- target.visible_message("[source.name] no longer holds [target.name] at gunpoint.", "[source.name] no longer holds you at gunpoint.")
+ target.visible_message("[source.name] no longer holds [target.name] at gunpoint.", "[source.name] no longer holds you at gunpoint.")
source = null
target = null
aimed_gun = null
diff --git a/modular_skyrat/modules/horrorform/code/modules/mob/hostile/true_changeling.dm b/modular_skyrat/modules/horrorform/code/modules/mob/hostile/true_changeling.dm
index cfa4b15e5b0..6361d155af7 100644
--- a/modular_skyrat/modules/horrorform/code/modules/mob/hostile/true_changeling.dm
+++ b/modular_skyrat/modules/horrorform/code/modules/mob/hostile/true_changeling.dm
@@ -38,9 +38,9 @@
var/datum/action/innate/turn_to_human
var/datum/action/innate/devour
var/transformed_time = 0
- var/playstyle_string = "We have entered our true form! We are unbelievably powerful, and regenerate life at a steady rate. However, most of \
+ var/playstyle_string = "We have entered our true form! We are unbelievably powerful, and regenerate life at a steady rate. However, most of \
our abilities are useless in this form, and we must utilise the abilities that we have gained as a result of our transformation. Currently, we are incapable of returning to a human. \
- After several minutes, we will once again be able to revert into a human. Taking too much damage will cause us to reach equilibrium and our cells will combust into a shower of gore, watch out!"
+ After several minutes, we will once again be able to revert into a human. Taking too much damage will cause us to reach equilibrium and our cells will combust into a shower of gore, watch out!"
var/mob/living/carbon/human/stored_changeling = null //The changeling that transformed
var/devouring = FALSE //If the true changeling is currently devouring a human
@@ -71,7 +71,7 @@
if(stat)
return
if(act == "scream")
- message = "[src] makes a loud, bone-chilling roar!"
+ message = "[src] makes a loud, bone-chilling roar!"
act = "me"
scream(message)
return
@@ -79,7 +79,7 @@
/mob/living/simple_animal/hostile/true_changeling/proc/scream(message)
if(!message)
- message = "[src] makes a loud, bone-chilling roar!"
+ message = "[src] makes a loud, bone-chilling roar!"
var/frequency = get_rand_frequency() //so sound frequency is consistent
for(var/mob/M in range(35, src)) //You can hear the scream 7 screens away
// Double check for client
diff --git a/modular_skyrat/modules/mentor/code/mentorhelp.dm b/modular_skyrat/modules/mentor/code/mentorhelp.dm
index 9e1d3e8a01d..77862499537 100644
--- a/modular_skyrat/modules/mentor/code/mentorhelp.dm
+++ b/modular_skyrat/modules/mentor/code/mentorhelp.dm
@@ -15,7 +15,7 @@
return
var/show_char = CONFIG_GET(flag/mentors_mobname_only)
- var/mentor_msg = "MENTORHELP: [key_name_mentor(src, 1, 0, 1, show_char)]: [msg]"
+ var/mentor_msg = "MENTORHELP: [key_name_mentor(src, 1, 0, 1, show_char)]: [msg]"
log_mentor("MENTORHELP: [key_name_mentor(src, 0, 0, 0, 0)]: [msg]")
for(var/it in GLOB.mentors)
@@ -23,7 +23,7 @@
SEND_SOUND(X, 'sound/items/bikehorn.ogg')
to_chat(X, mentor_msg)
- to_chat(src, "PM to-Mentors: [msg]")
+ to_chat(src, "PM to-Mentors: [msg]")
return
/proc/get_mentor_counts()
diff --git a/modular_skyrat/modules/mentor/code/mentorpm.dm b/modular_skyrat/modules/mentor/code/mentorpm.dm
index fce7c475287..7e6684ce2ee 100644
--- a/modular_skyrat/modules/mentor/code/mentorpm.dm
+++ b/modular_skyrat/modules/mentor/code/mentorpm.dm
@@ -32,7 +32,7 @@
return
if(is_mentor(whom))
- to_chat(GLOB.mentors, "[src] has started replying to [whom]'s mhelp.")
+ to_chat(GLOB.mentors, "[src] has started replying to [whom]'s mhelp.")
//get message text, limit it's length.and clean/escape html
if(!msg)
@@ -40,7 +40,7 @@
if(!msg)
if (is_mentor(whom))
- to_chat(GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.")
+ to_chat(GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.")
return
if(!C)
@@ -57,7 +57,7 @@
msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN))
if(!msg)
if (is_mentor(whom))
- to_chat(GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.")
+ to_chat(GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.")
return
log_mentor("Mentor PM: [key_name(src)]->[key_name(C)]: [msg]")
@@ -66,17 +66,17 @@
var/show_char = CONFIG_GET(flag/mentors_mobname_only)
if(C.is_mentor())
if(is_mentor())//both are mentors
- to_chat(C, "Mentor PM from-[key_name_mentor(src, C, 1, 0, 0)]: [msg]")
- to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, 0)]: [msg]")
+ to_chat(C, "Mentor PM from-[key_name_mentor(src, C, 1, 0, 0)]: [msg]")
+ to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, 0)]: [msg]")
else //recipient is a mentor but sender is not
- to_chat(C, "Reply PM from-[key_name_mentor(src, C, 1, 0, show_char)]: [msg]")
- to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, 0)]: [msg]")
+ to_chat(C, "Reply PM from-[key_name_mentor(src, C, 1, 0, show_char)]: [msg]")
+ to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, 0)]: [msg]")
else
if(is_mentor()) //sender is a mentor but recipient is not.
- to_chat(C, "Mentor PM from-[key_name_mentor(src, C, 1, 0, 0)]: [msg]")
- to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, show_char)]: [msg]")
+ to_chat(C, "Mentor PM from-[key_name_mentor(src, C, 1, 0, 0)]: [msg]")
+ to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, show_char)]: [msg]")
//we don't use message_Mentors here because the sender/receiver might get it too
var/show_char_sender = !is_mentor() && CONFIG_GET(flag/mentors_mobname_only)
@@ -84,4 +84,4 @@
for(var/it in GLOB.mentors)
var/client/X = it
if(X.key!=key && X.key!=C.key) //check client/X is an Mentor and isn't the sender or recipient
- to_chat(X, "Mentor PM: [key_name_mentor(src, X, 0, 0, show_char_sender)]->[key_name_mentor(C, X, 0, 0, show_char_recip)]: [msg]") //inform X
+ to_chat(X, "Mentor PM: [key_name_mentor(src, X, 0, 0, show_char_sender)]->[key_name_mentor(C, X, 0, 0, show_char_recip)]: [msg]") //inform X
diff --git a/modular_skyrat/modules/mentor/code/mentorsay.dm b/modular_skyrat/modules/mentor/code/mentorsay.dm
index b69ce29047d..080bad4a871 100644
--- a/modular_skyrat/modules/mentor/code/mentorsay.dm
+++ b/modular_skyrat/modules/mentor/code/mentorsay.dm
@@ -13,7 +13,7 @@
log_mentor("MSAY: [key_name(src)] : [msg]")
if(check_rights_for(src, R_ADMIN,0))
- msg = "MENTOR: [key_name(src, 0, 0)]: [msg]"
+ msg = "MENTOR: [key_name(src, 0, 0)]: [msg]"
else
- msg = "MENTOR: [key_name(src, 0, 0)]: [msg]"
+ msg = "MENTOR: [key_name(src, 0, 0)]: [msg]"
to_chat(GLOB.admins | GLOB.mentors, msg)
diff --git a/modular_skyrat/modules/mentor/code/mentorwho.dm b/modular_skyrat/modules/mentor/code/mentorwho.dm
index b374a078232..500a5587bb2 100644
--- a/modular_skyrat/modules/mentor/code/mentorwho.dm
+++ b/modular_skyrat/modules/mentor/code/mentorwho.dm
@@ -18,5 +18,5 @@
if(C.is_afk())
suffix += " (AFK)"
- msg += "\t[C][suffix]\n"
+ msg += "\t[C][suffix]\n"
to_chat(src, msg)
diff --git a/modular_skyrat/modules/ssd_indicator/code/mob.dm b/modular_skyrat/modules/ssd_indicator/code/mob.dm
index d9434ae68d4..b474317623d 100644
--- a/modular_skyrat/modules/ssd_indicator/code/mob.dm
+++ b/modular_skyrat/modules/ssd_indicator/code/mob.dm
@@ -34,5 +34,5 @@ GLOBAL_VAR_INIT(ssd_indicator_overlay, mutable_appearance('modular_skyrat/module
//This proc should stop mobs from having the overlay when someone keeps jumping control of mobs, unfortunately it causes Aghosts to have their character without the SSD overlay, I wasn't able to find a better proc unfortunately
/mob/living/transfer_ckey(mob/new_mob, send_signal = TRUE)
..()
- set_ssd_indicator(FALSE)
+ set_ssd_indicator(FALSE)
*/
diff --git a/modular_skyrat/modules/verbs/code/modules/client/preferences_toggles.dm b/modular_skyrat/modules/verbs/code/modules/client/preferences_toggles.dm
index 7f0b441b23b..cc2abd1a36d 100644
--- a/modular_skyrat/modules/verbs/code/modules/client/preferences_toggles.dm
+++ b/modular_skyrat/modules/verbs/code/modules/client/preferences_toggles.dm
@@ -5,5 +5,5 @@
set desc = "Toggles seeing LocalOutOfCharacter chat"
usr.client.prefs.skyrat_toggles ^= CHAT_LOOC
usr.client.prefs.save_preferences()
- to_chat(usr, "You will [(usr.client.prefs.skyrat_toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel.")
+ to_chat(usr, "You will [(usr.client.prefs.skyrat_toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel.")
SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Seeing LOOC", "[usr.client.prefs.skyrat_toggles & CHAT_LOOC ? "Enabled" : "Disabled"]"))
diff --git a/modular_skyrat/modules/verbs/code/modules/client/verbs/looc.dm b/modular_skyrat/modules/verbs/code/modules/client/verbs/looc.dm
index 6c0f7f64989..91a2a9ee1c5 100644
--- a/modular_skyrat/modules/verbs/code/modules/client/verbs/looc.dm
+++ b/modular_skyrat/modules/verbs/code/modules/client/verbs/looc.dm
@@ -21,7 +21,7 @@
if(handle_spam_prevention(msg,MUTE_OOC))
return
if(findtext(msg, "byond://"))
- to_chat(src, "Advertising other servers is not allowed.")
+ to_chat(src, "Advertising other servers is not allowed.")
log_admin("[key_name(src)] has attempted to advertise in LOOC: [msg]")
return
if(mob.stat)
@@ -65,5 +65,5 @@
return
prefs.skyrat_toggles ^= CHAT_LOOC_ADMIN
prefs.save_preferences()
- to_chat(usr, "You will [(prefs.skyrat_toggles & CHAT_LOOC_ADMIN) ? "now" : "no longer"] hear LOOC globally.")
+ to_chat(usr, "You will [(prefs.skyrat_toggles & CHAT_LOOC_ADMIN) ? "now" : "no longer"] hear LOOC globally.")
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Togle Admin LOOC", "[usr.client.prefs.skyrat_toggles & CHAT_LOOC_ADMIN ? "Enabled" : "Disabled"]"))
diff --git a/tgstation.dme b/tgstation.dme
index a108e502d05..702af709c4b 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3763,6 +3763,7 @@
#include "modular_skyrat\modules\brigoff\code\modules\jobs\job_types\brigoff.dm"
#include "modular_skyrat\modules\bsa_overhaul\code\bsa_cannon.dm"
#include "modular_skyrat\modules\bsa_overhaul\code\bsa_computer.dm"
+#include "modular_skyrat\modules\bsrpd\code\bsrpd.dm"
#include "modular_skyrat\modules\bulletrebalance\sniper.dm"
#include "modular_skyrat\modules\cargo\code\bloat.dm"
#include "modular_skyrat\modules\cargo\code\goodies.dm"
@@ -4144,6 +4145,8 @@
#include "modular_skyrat\modules\mentor\code\mentorpm.dm"
#include "modular_skyrat\modules\mentor\code\mentorsay.dm"
#include "modular_skyrat\modules\mentor\code\mentorwho.dm"
+#include "modular_skyrat\modules\Midroundtraitor\datum_traitor.dm"
+#include "modular_skyrat\modules\Midroundtraitor\event.dm"
#include "modular_skyrat\modules\modular_items\code\datums\components\crafting\recipes\recipes_misc.dm"
#include "modular_skyrat\modules\modular_items\code\datums\components\crafting\recipes\tailoring.dm"
#include "modular_skyrat\modules\modular_items\code\game\modular_clothing.dm"
diff --git a/tgui/packages/tgui-panel/chat/constants.js b/tgui/packages/tgui-panel/chat/constants.js
index 3719c8618bd..9ee44791473 100644
--- a/tgui/packages/tgui-panel/chat/constants.js
+++ b/tgui/packages/tgui-panel/chat/constants.js
@@ -82,7 +82,7 @@ export const MESSAGE_TYPES = [
type: MESSAGE_TYPE_OOC,
name: 'OOC',
description: 'The bluewall of global OOC messages',
- selector: '.ooc, .adminooc, .oocplain, .looc',
+ selector: '.ooc, .adminooc, .oocplain, .looc, .rlooc',
},
{
type: MESSAGE_TYPE_ADMINPM,