diff --git a/Dockerfile b/Dockerfile
index 7cc479b926..a28b231eab 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM tgstation/byond:512.1463 as base
+FROM tgstation/byond:512.1467 as base
FROM base as build_base
diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index aea7d42be6..4ed099d9e2 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -121,3 +121,4 @@
#define ORGAN_SLOT_BRAIN_ANTIDROP "brain_antidrop"
#define ORGAN_SLOT_BRAIN_ANTISTUN "brain_antistun"
#define ORGAN_SLOT_TAIL "tail"
+#define ORGAN_SLOT_PENIS "penis"
diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index ef14dbcaa3..b150067717 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -95,6 +95,7 @@
#define NOAROUSAL 37 //Stops all arousal effects
#define NOGENITALS 38 //Cannot create, use, or otherwise have genitals
#define MATRIXED 39 //if icon is color matrix'd
+#define SKINTONE 40 //uses skin tones
//Citadel istypes
#define isborer(A) (istype(A, /mob/living/simple_animal/borer))
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 709a4daeba..be58b64f41 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -474,4 +474,6 @@ GLOBAL_LIST_INIT(pda_styles, list(MONO, VT, ORBITRON, SHARE))
#define CLIENT_FROM_VAR(I) (ismob(I) ? I:client : (istype(I, /client) ? I : (istype(I, /datum/mind) ? I:current?:client : null)))
#define AREASELECT_CORNERA "corner A"
-#define AREASELECT_CORNERB "corner B"
\ No newline at end of file
+#define AREASELECT_CORNERB "corner B"
+
+#define PREF_SAVELOAD_COOLDOWN 5
\ No newline at end of file
diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm
index 165cea9557..cdd2e99dd8 100644
--- a/code/__HELPERS/roundend.dm
+++ b/code/__HELPERS/roundend.dm
@@ -199,6 +199,10 @@
if(length(CONFIG_GET(keyed_list/cross_server)))
send_news_report()
+ //tell the nice people on discord what went on before the salt cannon happens.
+ world.TgsTargetedChatBroadcast("The current round has ended. Please standby for your shift interlude Nanotrasen News Network's report!", FALSE)
+ world.TgsTargetedChatBroadcast(send_news_report(),FALSE)
+
CHECK_TICK
//These need update to actually reflect the real antagonists
diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm
index d0506c7dcb..36049de77b 100644
--- a/code/_globalvars/lists/maintenance_loot.dm
+++ b/code/_globalvars/lists/maintenance_loot.dm
@@ -108,5 +108,6 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/toy/eightball = 1,
/obj/item/reagent_containers/pill/floorpill = 1,
/obj/item/storage/daki = 3, //VERY IMPORTANT CIT CHANGE - adds bodypillows to maint
+ /obj/item/storage/pill_bottle/penis_enlargement = 2,
"" = 3
))
diff --git a/code/controllers/subsystem/processing/circuit.dm b/code/controllers/subsystem/processing/circuit.dm
index 1ae5bad23c..880e7a16a8 100644
--- a/code/controllers/subsystem/processing/circuit.dm
+++ b/code/controllers/subsystem/processing/circuit.dm
@@ -50,17 +50,20 @@ PROCESSING_SUBSYSTEM_DEF(circuit)
/obj/item/electronic_assembly/simple,
/obj/item/electronic_assembly/hook,
/obj/item/electronic_assembly/pda,
+ /obj/item/electronic_assembly/dildo,
/obj/item/electronic_assembly/small/default,
/obj/item/electronic_assembly/small/cylinder,
/obj/item/electronic_assembly/small/scanner,
/obj/item/electronic_assembly/small/hook,
/obj/item/electronic_assembly/small/box,
+ /obj/item/electronic_assembly/small/dildo,
/obj/item/electronic_assembly/medium/default,
/obj/item/electronic_assembly/medium/box,
/obj/item/electronic_assembly/medium/clam,
/obj/item/electronic_assembly/medium/medical,
/obj/item/electronic_assembly/medium/gun,
/obj/item/electronic_assembly/medium/radio,
+ /obj/item/electronic_assembly/medium/dildo,
/obj/item/electronic_assembly/large/default,
/obj/item/electronic_assembly/large/scope,
/obj/item/electronic_assembly/large/terminal,
@@ -89,4 +92,4 @@ PROCESSING_SUBSYSTEM_DEF(circuit)
/obj/item/card/data/full_color,
/obj/item/card/data/disk
)
-
+
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 9a4cad3667..4a3143da79 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -564,6 +564,9 @@ SUBSYSTEM_DEF(ticker)
if(news_message)
send2otherserver(news_source, news_message,"News_Report")
+ return news_message
+ else
+ return "We regret to inform you that shit be whack, yo. None of our reporters have any idea of what may or may not have gone on."
/datum/controller/subsystem/ticker/proc/GetTimeLeft()
if(isnull(SSticker.timeLeft))
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 43e8dff2b9..b84db2ca8d 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -63,7 +63,7 @@
storage_type = /obj/item/watertank/atmos
/obj/machinery/suit_storage_unit/mining
- suit_type = /obj/item/clothing/suit/hooded/explorer
+ suit_type = /obj/item/clothing/suit/hooded/explorer/standard
mask_type = /obj/item/clothing/mask/gas/explorer
/obj/machinery/suit_storage_unit/mining/eva
diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm
index 16e13a9fe2..56e47ed6f5 100644
--- a/code/game/objects/empulse.dm
+++ b/code/game/objects/empulse.dm
@@ -9,7 +9,7 @@
message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ")
log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ")
- if(heavy_range > 1)
+ if(heavy_range >= 1)
new /obj/effect/temp_visual/emp/pulse(epicenter)
if(heavy_range > light_range)
diff --git a/code/game/objects/items/AI_modules.dm b/code/game/objects/items/AI_modules.dm
index d818191055..a8d0bed2aa 100644
--- a/code/game/objects/items/AI_modules.dm
+++ b/code/game/objects/items/AI_modules.dm
@@ -362,7 +362,7 @@ AI MODULES
/obj/item/aiModule/core/full/asimov
name = "'Asimov' Core AI Module"
law_id = "asimov"
- var/subject = "human being"
+ var/subject = "person of an NT approved crew species" //CITADEL CHANGED FROM HUMANS!
/obj/item/aiModule/core/full/asimov/attack_self(var/mob/user as mob)
var/targName = stripped_input(user, "Please enter a new subject that asimov is concerned with.", "Asimov to whom?", subject)
diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm
index 730a459ed4..bbd2e67464 100644
--- a/code/game/objects/items/inducer.dm
+++ b/code/game/objects/items/inducer.dm
@@ -12,6 +12,7 @@
var/cell_type = /obj/item/stock_parts/cell/high
var/obj/item/stock_parts/cell/cell
var/recharging = FALSE
+ var/gun_charger = FALSE
/obj/item/inducer/Initialize()
. = ..()
@@ -104,7 +105,7 @@
var/obj/item/stock_parts/cell/C = A.get_cell()
var/obj/O
var/coefficient = 1
- if(istype(A, /obj/item/gun/energy))
+ if(istype(A, /obj/item/gun/energy) && gun_charger != TRUE)
to_chat(user,"Error unable to interface with device")
return FALSE
if(istype(A, /obj))
@@ -181,3 +182,26 @@
/obj/item/inducer/sci/Initialize()
. = ..()
update_icon()
+
+/obj/item/inducer/sci/combat
+ icon_state = "inducer-combat"
+ item_state = "inducer-combat"
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = SLOT_BELT
+ desc = "A tool for inductively charging internal power cells. This one has been modified and upgraded to be able to charge into guns as well as normal electronics."
+ cell_type = /obj/item/stock_parts/cell/hyper
+ powertransfer = 1300
+ opened = FALSE
+ gun_charger = TRUE
+
+/obj/item/inducer/sci/combat/dry
+ cell_type = null
+ opened = TRUE
+
+/obj/item/inducer/sci/combat/dry/Initialize() //Just in case
+ . = ..()
+ update_icon()
+
+/obj/item/inducer/sci/combat/Initialize()
+ . = ..()
+ update_icon()
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index e63ddd1c02..89d939e505 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -382,8 +382,8 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \
GLOBAL_LIST_INIT(brass_recipes, list ( \
new/datum/stack_recipe("wall gear", /obj/structure/destructible/clockwork/wall_gear, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
null,
- new/datum/stack_recipe("pinion airlock", /obj/machinery/door/airlock/clockwork, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
- new/datum/stack_recipe("brass pinion airlock", /obj/machinery/door/airlock/clockwork/brass, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("brass pinion airlock", /obj/machinery/door/airlock/clockwork, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("brass pinion airlock - windowed", /obj/machinery/door/airlock/clockwork/brass, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("brass windoor", /obj/machinery/door/window/clockwork, 2, time = 30, on_floor = TRUE, window_checks = TRUE), \
null,
new/datum/stack_recipe("directional brass window", /obj/structure/window/reinforced/clockwork/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
@@ -392,11 +392,14 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \
new/datum/stack_recipe("brass table frame", /obj/structure/table_frame/brass, 1, time = 5, one_per_turf = TRUE, on_floor = TRUE), \
null,
new/datum/stack_recipe("sender - pressure sensor", /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("sender - mech sensor", /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("sender - lever", /obj/structure/destructible/clockwork/trap/trigger/lever, 1, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("sender - repeater", /obj/structure/destructible/clockwork/trap/trigger/repeater, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
null,
new/datum/stack_recipe("receiver - brass skewer", /obj/structure/destructible/clockwork/trap/brass_skewer, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_ADJACENT), \
new/datum/stack_recipe("receiver - steam vent", /obj/structure/destructible/clockwork/trap/steam_vent, 3, time = 30, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \
+ new/datum/stack_recipe("receiver - power nullifier", /obj/structure/destructible/clockwork/trap/power_nullifier, 5, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \
+
))
/obj/item/stack/tile/brass
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 25fc96c251..1f1143e7ce 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -48,6 +48,13 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 50)
component_type = /datum/component/storage/concrete/bluespace/bag_of_holding
+/obj/item/storage/backpack/holding/satchel
+ name = "satchel of holding"
+ desc = "A satchel that opens into a localized pocket of Blue Space."
+ icon_state = "holdingsat"
+ item_state = "holdingsat"
+ species_exception = list(/datum/species/angel)
+
/obj/item/storage/backpack/holding/ComponentInitialize()
. = ..()
GET_COMPONENT(STR, /datum/component/storage)
diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm
index 079feec17a..1a666ce921 100644
--- a/code/game/objects/items/storage/firstaid.dm
+++ b/code/game/objects/items/storage/firstaid.dm
@@ -122,7 +122,7 @@
new /obj/item/reagent_containers/pill/antirad(src)
new /obj/item/reagent_containers/food/drinks/bottle/vodka(src)
new /obj/item/healthanalyzer(src)
-
+
/obj/item/storage/firstaid/o2
name = "oxygen deprivation treatment kit"
@@ -312,3 +312,11 @@
/obj/item/storage/pill_bottle/mutarad/PopulateContents()
for(var/i in 1 to 7)
new /obj/item/reagent_containers/pill/mutarad(src)
+
+/obj/item/storage/pill_bottle/penis_enlargement
+ name = "penis enlargement pills"
+ desc = "You want penis enlargement pills?"
+
+/obj/item/storage/pill_bottle/penis_enlargement/PopulateContents()
+ for(var/i in 1 to 7)
+ new /obj/item/reagent_containers/pill/penis_enlargement(src)
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index eb9fc86516..9b8d2b4a21 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -208,3 +208,38 @@
new/obj/item/stack/cable_coil/orange(src)
new/obj/item/stack/cable_coil/cyan(src)
new/obj/item/stack/cable_coil/white(src)
+
+/obj/item/storage/toolbox/gold_real
+ name = "golden toolbox"
+ desc = "A larger then normal toolbox made of gold plated plastitanium."
+ item_state = "gold"
+ icon_state = "gold"
+ has_latches = FALSE
+ force = 16 // Less then a spear
+ throwforce = 14
+ throw_speed = 5
+ throw_range = 10
+
+/obj/item/storage/toolbox/gold_real/PopulateContents()
+ new /obj/item/screwdriver/nuke(src)
+ new /obj/item/wrench(src)
+ new /obj/item/weldingtool/largetank(src)
+ new /obj/item/crowbar/red(src)
+ new /obj/item/wirecutters(src, "red")
+ new /obj/item/multitool/ai_detect(src)
+ new /obj/item/clothing/gloves/combat(src)
+
+/obj/item/storage/toolbox/gold_real/ComponentInitialize()
+ . = ..()
+ GET_COMPONENT(STR, /datum/component/storage)
+ STR.max_combined_w_class = 40
+ STR.max_items = 12
+
+/obj/item/storage/toolbox/gold_fake // used in crafting
+ name = "golden toolbox"
+ desc = "A gold plated toolbox, fancy and harmless do to the gold plating being on cardboard!"
+ icon_state = "gold"
+ item_state = "gold"
+ has_latches = FALSE
+ force = 0
+ throwforce = 0
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 294611c1f1..19848f45ea 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -225,6 +225,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/katana/cursed
slot_flags = null
+ item_flags = NODROP
/obj/item/katana/suicide_act(mob/user)
user.visible_message("[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku!")
diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm
index 6d3f498a8c..0e2f951f38 100644
--- a/code/game/objects/structures/musician.dm
+++ b/code/game/objects/structures/musician.dm
@@ -1,6 +1,6 @@
#define MUSICIAN_HEARCHECK_MINDELAY 4
-#define MUSIC_MAXLINES 300
+#define MUSIC_MAXLINES 600
#define MUSIC_MAXLINECHARS 50
/datum/song
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm
index 3056b459d8..97a799824b 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm
@@ -217,3 +217,7 @@
/proc/_step_away(ref, trg, max)
step_away(ref, trg, max)
+/proc/_instantiate_at(thing, location)
+ new thing(location)
+
+
diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
index 3fa1020000..b14541d3c8 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
@@ -503,6 +503,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
L.lastattacker = user.real_name
L.lastattackerckey = user.ckey
+ L.adjustStaminaLoss(35) //because previously it took 5-6 hits to actually "incapacitate" someone for the purposes of the sleep inducement
L.Knockdown(140)
L.apply_effect(EFFECT_STUTTER, 7)
SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
diff --git a/code/modules/antagonists/blob/blob/blobs/shield.dm b/code/modules/antagonists/blob/blob/blobs/shield.dm
index a83f4294b2..d52c208c71 100644
--- a/code/modules/antagonists/blob/blob/blobs/shield.dm
+++ b/code/modules/antagonists/blob/blob/blobs/shield.dm
@@ -8,7 +8,7 @@
explosion_block = 3
point_return = 4
atmosblock = TRUE
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
+ armor = list("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
/obj/structure/blob/shield/scannerreport()
if(atmosblock)
@@ -20,11 +20,12 @@
/obj/structure/blob/shield/update_icon()
..()
- if(obj_integrity <= 75)
+ if(obj_integrity <= 70)
icon_state = "blob_shield_damaged"
name = "weakened strong blob"
desc = "A wall of twitching tendrils."
atmosblock = FALSE
+ armor = list("melee" = 15, "bullet" = 15, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
else
icon_state = initial(icon_state)
name = initial(name)
diff --git a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor_mech.dm b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor_mech.dm
new file mode 100644
index 0000000000..3eac1b9fef
--- /dev/null
+++ b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor_mech.dm
@@ -0,0 +1,20 @@
+//Mech sensor: Activates when stepped on by a mech
+/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech
+ name = "mech sensor"
+ desc = "A thin plate of brass, barely visible but clearly distinct."
+ clockwork_desc = "A trigger that will activate when a mech controlled by a non-servant runs across it."
+ max_integrity = 5
+ icon_state = "pressure_sensor"
+ alpha = 75
+
+/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech/Crossed(atom/movable/AM)
+
+ if(!istype(AM,/obj/mecha/))
+ return
+
+ var/obj/mecha/M = AM
+ if(M.occupant && is_servant_of_ratvar(M.occupant))
+ return
+ audible_message("*click*")
+ playsound(src, 'sound/items/screwdriver2.ogg', 50, TRUE)
+ activate()
\ No newline at end of file
diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm
index 6312228447..ebfb219c9a 100644
--- a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm
@@ -68,7 +68,14 @@
mouse_opacity = MOUSE_OPACITY_OPAQUE //So players can interact with the tile it's on to pull them off
buckle_mob(squirrel, TRUE)
else
- visible_message("A massive brass spike erupts from the ground!")
+ var/obj/mecha/M = locate() in get_turf(src)
+ if(M)
+ M.take_damage(50,BRUTE,"melee")
+ M.visible_message("A massive brass spike erupts from the ground, penetrating \the [M] and shattering the trap into pieces!")
+ addtimer(CALLBACK(src, .proc/take_damage, max_integrity), 1)
+ else
+ visible_message("A massive brass spike erupts from the ground!")
+
playsound(src, 'sound/machines/clockcult/brass_skewer.ogg', 75, FALSE)
icon_state = "[initial(icon_state)]_extended"
density = TRUE //Skewers are one-use only
diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/power_null.dm b/code/modules/antagonists/clockcult/clock_structures/traps/power_null.dm
new file mode 100644
index 0000000000..6c8477ab5b
--- /dev/null
+++ b/code/modules/antagonists/clockcult/clock_structures/traps/power_null.dm
@@ -0,0 +1,17 @@
+/obj/structure/destructible/clockwork/trap/power_nullifier
+ name = "power nullifier"
+ desc = "A well hidden set of wires and connections."
+ clockwork_desc = "When triggered, it sets off a 3x3 emp pulse with the center suffering a stronger pulse."
+ icon_state = "electric_trap"
+ break_message = "The power nullifier sparks, then slowly crumbles to debris!"
+ max_integrity = 40
+ density = FALSE
+ var/activated = FALSE
+
+/obj/structure/destructible/clockwork/trap/power_nullifier/activate()
+ if(!activated)
+ activated = TRUE
+ empulse(get_turf(src),1,1,TRUE)
+
+/obj/structure/destructible/clockwork/trap/power_nullifier/emp_act(var/strength=1)
+ activate()
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 633f4fa850..ca8f10869d 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -1699,7 +1699,7 @@
/obj/item/t_scanner/adv_mining_scanner/lesser,
/obj/item/radio/headset/headset_cargo/mining,
/obj/item/storage/bag/ore,
- /obj/item/clothing/suit/hooded/explorer,
+ /obj/item/clothing/suit/hooded/explorer/standard,
/obj/item/clothing/mask/gas/explorer)
crate_name = "shaft miner starter kit"
crate_type = /obj/structure/closet/crate/secure
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 24768279b8..8e4891fb70 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -21,6 +21,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/last_ip
var/last_id
+ //Cooldowns for saving/loading. These are four are all separate due to loading code calling these one after another
+ var/saveprefcooldown
+ var/loadprefcooldown
+ var/savecharcooldown
+ var/loadcharcooldown
+
//game-preferences
var/lastchangelog = "" //Saved changlog filesize to detect if there was a change
var/ooccolor = null
@@ -75,10 +81,76 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/eye_color = "000" //Eye color
var/datum/species/pref_species = new /datum/species/human() //Mutant race
var/list/features = list("mcolor" = "FFF",
- "tail_lizard" = "Smooth", "tail_human" = "Cat",
- "snout" = "Round", "horns" = "None", "ears" = "Cat",
- "wings" = "None", "frills" = "None", "spines" = "None",
- "body_markings" = "None", "legs" = "Normal Legs", "moth_wings" = "Plain")
+ "tail_lizard" = "Smooth",
+ "tail_human" = "None",
+ "snout" = "Round",
+ "horns" = "None",
+ "ears" = "None",
+ "wings" = "None",
+ "frills" = "None",
+ "spines" = "None",
+ "body_markings" = "None",
+ "legs" = "Normal Legs",
+ "moth_wings" = "Plain",
+ "mcolor2" = "FFF",
+ "mcolor3" = "FFF",
+ "mam_body_markings" = "Plain",
+ "mam_ears" = "None",
+ "mam_snouts" = "None",
+ "mam_tail" = "None",
+ "mam_tail_animated" = "None",
+ "xenodorsal" = "Standard",
+ "xenohead" = "Standard",
+ "xenotail" = "Xenomorph Tail",
+ "taur" = "None",
+ "exhibitionist" = FALSE,
+ "genitals_use_skintone" = FALSE,
+ "has_cock" = FALSE,
+ "cock_shape" = "Human",
+ "cock_length" = 6,
+ "cock_girth_ratio" = COCK_GIRTH_RATIO_DEF,
+ "cock_color" = "fff",
+ "has_sheath" = FALSE,
+ "sheath_color" = "fff",
+ "has_balls" = FALSE,
+ "balls_internal" = FALSE,
+ "balls_color" = "fff",
+ "balls_amount" = 2,
+ "balls_sack_size" = BALLS_SACK_SIZE_DEF,
+ "balls_size" = BALLS_SIZE_DEF,
+ "balls_cum_rate" = CUM_RATE,
+ "balls_cum_mult" = CUM_RATE_MULT,
+ "balls_efficiency" = CUM_EFFICIENCY,
+ "balls_fluid" = "semen",
+ "has_ovi" = FALSE,
+ "ovi_shape" = "knotted",
+ "ovi_length" = 6,
+ "ovi_color" = "fff",
+ "has_eggsack" = FALSE,
+ "eggsack_internal" = TRUE,
+ "eggsack_color" = "fff",
+ "eggsack_size" = BALLS_SACK_SIZE_DEF,
+ "eggsack_egg_color" = "fff",
+ "eggsack_egg_size" = EGG_GIRTH_DEF,
+ "has_breasts" = FALSE,
+ "breasts_color" = "fff",
+ "breasts_size" = "C",
+ "breasts_shape" = "Pair",
+ "breasts_fluid" = "milk",
+ "has_vag" = FALSE,
+ "vag_shape" = "Human",
+ "vag_color" = "fff",
+ "vag_clits" = 1,
+ "vag_clit_diam" = 0.25,
+ "has_womb" = FALSE,
+ "womb_cum_rate" = CUM_RATE,
+ "womb_cum_mult" = CUM_RATE_MULT,
+ "womb_efficiency" = CUM_EFFICIENCY,
+ "womb_fluid" = "femcum",
+ "ipc_screen" = "Sunburst",
+ "ipc_antenna" = "None",
+ "flavor_text" = ""
+ )
var/list/custom_names = list()
var/prefered_security_department = SEC_DEPT_RANDOM
@@ -842,9 +914,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "
[gear.cost] | "
if(islist(gear.restricted_roles))
if(gear.restricted_roles.len)
- dat += ""
- dat += gear.restricted_roles.Join(";")
- dat += ""
+ if(gear.restricted_desc)
+ dat += ""
+ dat += gear.restricted_desc
+ dat += ""
+ else
+ dat += ""
+ dat += gear.restricted_roles.Join(";")
+ dat += ""
dat += " | [gear.description] | "
dat += ""
@@ -1463,8 +1540,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["body_markings"] = "None"
if(!("mam_body_markings" in pref_species.default_features))
features["mam_body_markings"] = "None"
- if("mam_body_markings" in pref_species.default_features && features["mam_body_markings"] == "None")
- features["mam_body_markings"] = "Plain"
+ if("mam_body_markings" in pref_species.default_features)
+ if(features["mam_body_markings"] == "None")
+ features["mam_body_markings"] = "Plain"
if("tail_lizard" in pref_species.default_features)
features["tail_lizard"] = "Smooth"
if(pref_species.id == "felinid")
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 6d165bc531..39b44f1ab9 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -58,6 +58,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/load_preferences()
if(!path)
return 0
+ if(world.time < loadprefcooldown)
+ if(istype(parent))
+ to_chat(parent, "You're attempting to load your preferences a little too fast. Wait half a second, then try again.")
+ return 0
+ loadprefcooldown = world.time + PREF_SAVELOAD_COOLDOWN
if(!fexists(path))
return 0
@@ -152,6 +157,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/save_preferences()
if(!path)
return 0
+ if(world.time < saveprefcooldown)
+ if(istype(parent))
+ to_chat(parent, "You're attempting to save your preferences a little too fast. Wait half a second, then try again.")
+ return 0
+ saveprefcooldown = world.time + PREF_SAVELOAD_COOLDOWN
var/savefile/S = new /savefile(path)
if(!S)
return 0
@@ -204,6 +214,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/load_character(slot)
if(!path)
return 0
+ if(world.time < loadcharcooldown) //This is before the check to see if the filepath exists to ensure that BYOND can't get hung up on read attempts when the hard drive is a little slow
+ if(istype(parent))
+ to_chat(parent, "You're attempting to load your character a little too fast. Wait half a second, then try again.")
+ return "SLOW THE FUCK DOWN" //the reason this isn't null is to make sure that people don't have their character slots overridden by random chars if they accidentally double-click a slot
+ loadcharcooldown = world.time + PREF_SAVELOAD_COOLDOWN
if(!fexists(path))
return 0
var/savefile/S = new /savefile(path)
@@ -418,6 +433,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/save_character()
if(!path)
return 0
+ if(world.time < savecharcooldown)
+ if(istype(parent))
+ to_chat(parent, "You're attempting to save your character a little too fast. Wait half a second, then try again.")
+ return 0
+ savecharcooldown = world.time + PREF_SAVELOAD_COOLDOWN
var/savefile/S = new /savefile(path)
if(!S)
return 0
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index d4cfbd1a84..5f7984c707 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -193,15 +193,14 @@
pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/collar/locked
var/lock = FALSE
-/obj/item/clothing/neck/petcollar/locked/attackby(obj/item/key/collar, mob/user, params)
- if(lock != FALSE)
- to_chat(user, "With a click the collar unlocks!")
- lock = FALSE
- item_flags = NONE
- else
- to_chat(user, "With a click the collar locks!")
- lock = TRUE
- item_flags = NODROP
+/obj/item/clothing/neck/petcollar/locked/attackby(obj/item/K, mob/user, params)
+ if(istype(K, /obj/item/key/collar))
+ if(lock != FALSE)
+ to_chat(user, "With a click the collar unlocks!")
+ lock = FALSE
+ else
+ to_chat(user, "With a click the collar locks!")
+ lock = TRUE
return
/obj/item/clothing/neck/petcollar/locked/attack_hand(mob/user)
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 02982998e1..c061d756b7 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -443,7 +443,6 @@
icon_state = "hardsuit0-medical"
item_state = "medical_helm"
item_color = "medical"
- flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
flash_protect = 0
armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75)
scan_reagents = 1
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 750b172286..328141b752 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -709,3 +709,14 @@
reqs = list(/obj/item/tank/internals/oxygen/red = 2, /obj/item/extinguisher = 1, /obj/item/pipe = 3, /obj/item/stack/cable_coil = 30)//red oxygen tank so it looks right
category = CAT_MISC
tools = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER)
+
+/datum/crafting_recipe/goldenbox
+ name = "Gold Plated Toolbox"
+ result = /obj/item/storage/toolbox/gold_fake
+ reqs = list(/obj/item/stack/sheet/cardboard = 1, //so we dont null items in crafting
+ /obj/item/stack/cable_coil = 10,
+ /obj/item/stack/sheet/mineral/gold = 1,
+ /obj/item/stock_parts/cell = 1,
+ /datum/reagent/water = 15)
+ time = 40
+ category = CAT_MISC
diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm
index 75833fc086..72fef4335d 100644
--- a/code/modules/events/vent_clog.dm
+++ b/code/modules/events/vent_clog.dm
@@ -73,7 +73,7 @@
var/obj/machinery/atmospherics/components/unary/vent = pick(vents)
vents -= vent
- if(!vent)
+ if(!vent || vent.welded)
return
var/turf/T = get_turf(vent)
@@ -150,7 +150,7 @@
/datum/round_event/vent_clog/beer/start()
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
- if(vent && vent.loc)
+ if(vent && vent.loc && !vent.welded)
var/datum/reagents/R = new/datum/reagents(1000)
R.my_atom = vent
R.add_reagent("beer", reagentsAmount)
@@ -165,7 +165,7 @@
/datum/round_event/vent_clog/male/start()
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
- if(vent && vent.loc)
+ if(vent && vent.loc && !vent.welded)
var/datum/reagents/R = new/datum/reagents(1000)
R.my_atom = vent
R.add_reagent("semen", reagentsAmount)
@@ -180,7 +180,7 @@
/datum/round_event/vent_clog/female/start()
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
- if(vent && vent.loc)
+ if(vent && vent.loc && !vent.welded)
var/datum/reagents/R = new/datum/reagents(1000)
R.my_atom = vent
R.add_reagent("femcum", reagentsAmount)
@@ -195,7 +195,7 @@
/datum/round_event/vent_clog/plasma_decon/start()
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
- if(vent && vent.loc)
+ if(vent && vent.loc && !vent.welded)
var/datum/effect_system/smoke_spread/freezing/decon/smoke = new
smoke.set_up(7, get_turf(vent), 7)
smoke.start()
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index e1eb976966..eaffeaf016 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -304,6 +304,8 @@
else if(href_list["create"])
var/amount = (text2num(href_list["amount"]))
+ //Can't be outside these (if you change this keep a sane limit)
+ amount = CLAMP(amount, 1, 50)
var/datum/design/D = locate(href_list["create"])
create_product(D, amount)
updateUsrDialog()
diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index 1a4bb1fb1b..3862967363 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -643,6 +643,11 @@
icon_state = "setup_small_pda"
desc = "It's a case, for building small electronics with. This one resembles a PDA."
+/obj/item/electronic_assembly/dildo
+ name = "type-g electronic assembly"
+ icon_state = "setup_dildo_medium"
+ desc = "It's a case, for building small electronics with. This one has a phallic design."
+
/obj/item/electronic_assembly/small
name = "electronic device"
icon_state = "setup_device"
@@ -674,6 +679,11 @@
icon_state = "setup_device_box"
desc = "It's a case, for building tiny-sized electronics with. This one has a boxy design."
+/obj/item/electronic_assembly/small/dildo
+ name = "type-f electronic device"
+ icon_state = "setup_dildo_small"
+ desc = "It's a case, for building tiny-sized electronics with. This one has a phallic design."
+
/obj/item/electronic_assembly/medium
name = "electronic mechanism"
icon_state = "setup_medium"
@@ -714,6 +724,12 @@
icon_state = "setup_medium_radio"
desc = "It's a case, for building medium-sized electronics with. This one resembles an old radio."
+/obj/item/electronic_assembly/medium/dildo
+ name = "type-g electronic mechanism"
+ icon_state = "setup_dildo_large"
+ desc = "It's a case, for building medium-sized electronics with. This one has a phallic design."
+
+
/obj/item/electronic_assembly/large
name = "electronic machine"
icon_state = "setup_large"
diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm
index c187f49473..682e76a46e 100644
--- a/code/modules/integrated_electronics/subtypes/manipulation.dm
+++ b/code/modules/integrated_electronics/subtypes/manipulation.dm
@@ -1,139 +1,6 @@
/obj/item/integrated_circuit/manipulation
category_text = "Manipulation"
-/obj/item/integrated_circuit/manipulation/weapon_firing
- name = "weapon firing mechanism"
- desc = "This somewhat complicated system allows one to slot in a gun, direct it towards a position, and remotely fire it."
- extended_desc = "The firing mechanism can slot in any energy weapon. \
- The first and second inputs need to be numbers which correspond to coordinates for the gun to fire at relative to the machine itself. \
- The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Mode will switch between \
- lethal (TRUE) or stun (FALSE) modes. It uses the internal battery of the weapon itself, not the assembly. If you wish to fire the gun while the circuit is in \
- hand, you will need to use an assembly that is a gun."
- complexity = 20
- w_class = WEIGHT_CLASS_SMALL
- size = 3
- inputs = list(
- "target X rel" = IC_PINTYPE_NUMBER,
- "target Y rel" = IC_PINTYPE_NUMBER,
- "mode" = IC_PINTYPE_BOOLEAN
- )
- outputs = list("reference to gun" = IC_PINTYPE_REF)
- activators = list(
- "fire" = IC_PINTYPE_PULSE_IN
-
- )
- var/obj/item/gun/energy/installed_gun = null
- spawn_flags = IC_SPAWN_RESEARCH
- action_flags = IC_ACTION_COMBAT
- power_draw_per_use = 0
- ext_cooldown = 1
- var/mode = FALSE
-
- var/stun_projectile = null //stun mode projectile type
- var/stun_projectile_sound
- var/lethal_projectile = null //lethal mode projectile type
- var/lethal_projectile_sound
-
- demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
-
-
-
-/obj/item/integrated_circuit/manipulation/weapon_firing/Destroy()
- qdel(installed_gun)
- return ..()
-
-/obj/item/integrated_circuit/manipulation/weapon_firing/attackby(var/obj/O, var/mob/user)
- if(istype(O, /obj/item/gun/energy))
- var/obj/item/gun/gun = O
- if(installed_gun)
- to_chat(user, "There's already a weapon installed.")
- return
- user.transferItemToLoc(gun,src)
- installed_gun = gun
- var/list/gun_properties = gun.get_turret_properties()
- to_chat(user, "You slide \the [gun] into the firing mechanism.")
- playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
- stun_projectile = gun_properties["stun_projectile"]
- stun_projectile_sound = gun_properties["stun_projectile_sound"]
- lethal_projectile = gun_properties["lethal_projectile"]
- lethal_projectile_sound = gun_properties["lethal_projectile_sound"]
- if(gun_properties["shot_delay"])
- cooldown_per_use = gun_properties["shot_delay"]*10
- if(cooldown_per_use<30)
- cooldown_per_use = 30
- if(gun_properties["reqpower"])
- power_draw_per_use = gun_properties["reqpower"]
- set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
- push_data()
- else
- ..()
-
-/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(var/mob/user)
- if(installed_gun)
- installed_gun.forceMove(drop_location())
- to_chat(user, "You slide \the [installed_gun] out of the firing mechanism.")
- size = initial(size)
- playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
- installed_gun = null
- set_pin_data(IC_OUTPUT, 1, WEAKREF(null))
- push_data()
- else
- to_chat(user, "There's no weapon to remove from the mechanism.")
-
-/obj/item/integrated_circuit/manipulation/weapon_firing/do_work()
- if(!installed_gun || !installed_gun.handle_pins())
- return
- if(!isturf(assembly.loc) && !(assembly.can_fire_equipped && ishuman(assembly.loc)))
- return
- set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
- push_data()
- var/datum/integrated_io/xo = inputs[1]
- var/datum/integrated_io/yo = inputs[2]
- var/datum/integrated_io/mode1 = inputs[3]
-
- mode = mode1.data
- if(assembly)
- if(isnum(xo.data))
- xo.data = round(xo.data, 1)
- if(isnum(yo.data))
- yo.data = round(yo.data, 1)
-
- var/turf/T = get_turf(assembly)
- var/target_x = CLAMP(T.x + xo.data, 0, world.maxx)
- var/target_y = CLAMP(T.y + yo.data, 0, world.maxy)
-
- assembly.visible_message("[assembly] fires [installed_gun]!")
- shootAt(locate(target_x, target_y, T.z))
-
-/obj/item/integrated_circuit/manipulation/weapon_firing/proc/shootAt(turf/target)
- var/turf/T = get_turf(src)
- var/turf/U = target
- if(!istype(T) || !istype(U))
- return
- if(!installed_gun.cell)
- return
- if(!installed_gun.cell.charge)
- return
- var/obj/item/ammo_casing/energy/shot = installed_gun.ammo_type[mode?2:1]
- if(installed_gun.cell.charge < shot.e_cost)
- return
- if(!shot)
- return
- update_icon()
- var/obj/item/projectile/A
- if(!mode)
- A = new stun_projectile(T)
- playsound(loc, stun_projectile_sound, 75, 1)
- else
- A = new lethal_projectile(T)
- playsound(loc, lethal_projectile_sound, 75, 1)
- installed_gun.cell.use(shot.e_cost)
- //Shooting Code:
- A.preparePixelProjectile(target, src)
- A.fire()
- log_attack("[assembly] [REF(assembly)] has fired [installed_gun].")
- return A
-
/obj/item/integrated_circuit/manipulation/locomotion
name = "locomotion circuit"
desc = "This allows a machine to move in a given direction."
@@ -171,80 +38,6 @@
return FALSE
return FALSE
-/obj/item/integrated_circuit/manipulation/grenade
- name = "grenade primer"
- desc = "This circuit comes with the ability to attach most types of grenades and prime them at will."
- extended_desc = "The time between priming and detonation is limited to between 1 to 12 seconds, but is optional. \
- If the input is not set, not a number, or a number less than 1, the grenade's built-in timing will be used. \
- Beware: Once primed, there is no aborting the process!"
- icon_state = "grenade"
- complexity = 30
- cooldown_per_use = 10
- inputs = list("detonation time" = IC_PINTYPE_NUMBER)
- outputs = list()
- activators = list("prime grenade" = IC_PINTYPE_PULSE_IN)
- spawn_flags = IC_SPAWN_RESEARCH
- action_flags = IC_ACTION_COMBAT
- var/obj/item/grenade/attached_grenade
- var/pre_attached_grenade_type
- demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
-
-/obj/item/integrated_circuit/manipulation/grenade/Initialize()
- . = ..()
- if(pre_attached_grenade_type)
- var/grenade = new pre_attached_grenade_type(src)
- attach_grenade(grenade)
-
-/obj/item/integrated_circuit/manipulation/grenade/Destroy()
- if(attached_grenade && !attached_grenade.active)
- attached_grenade.forceMove(loc)
- detach_grenade()
- return ..()
-
-/obj/item/integrated_circuit/manipulation/grenade/attackby(var/obj/item/grenade/G, var/mob/user)
- if(istype(G))
- if(attached_grenade)
- to_chat(user, "There is already a grenade attached!")
- else if(user.transferItemToLoc(G,src))
- user.visible_message("\The [user] attaches \a [G] to \the [src]!", "You attach \the [G] to \the [src].")
- attach_grenade(G)
- G.forceMove(src)
- else
- return ..()
-
-/obj/item/integrated_circuit/manipulation/grenade/attack_self(var/mob/user)
- if(attached_grenade)
- user.visible_message("\The [user] removes \an [attached_grenade] from \the [src]!", "You remove \the [attached_grenade] from \the [src].")
- user.put_in_hands(attached_grenade)
- detach_grenade()
- else
- return ..()
-
-/obj/item/integrated_circuit/manipulation/grenade/do_work()
- if(attached_grenade && !attached_grenade.active)
- var/datum/integrated_io/detonation_time = inputs[1]
- var/dt
- if(isnum(detonation_time.data) && detonation_time.data > 0)
- dt = CLAMP(detonation_time.data, 1, 12)*10
- else
- dt = 15
- addtimer(CALLBACK(attached_grenade, /obj/item/grenade.proc/prime), dt)
- var/atom/holder = loc
- message_admins("activated a grenade assembly. Last touches: Assembly: [holder.fingerprintslast] Circuit: [fingerprintslast] Grenade: [attached_grenade.fingerprintslast]")
-
-// These procs do not relocate the grenade, that's the callers responsibility
-/obj/item/integrated_circuit/manipulation/grenade/proc/attach_grenade(var/obj/item/grenade/G)
- attached_grenade = G
- G.forceMove(src)
- desc += " \An [attached_grenade] is attached to it!"
-
-/obj/item/integrated_circuit/manipulation/grenade/proc/detach_grenade()
- if(!attached_grenade)
- return
- attached_grenade.forceMove(drop_location())
- attached_grenade = null
- desc = initial(desc)
-
/obj/item/integrated_circuit/manipulation/plant_module
name = "plant manipulation module"
desc = "Used to uproot weeds and harvest/plant trays."
@@ -478,7 +271,7 @@
/obj/item/integrated_circuit/manipulation/thrower
name = "thrower"
- desc = "A compact launcher to throw things from inside or nearby tiles."
+ desc = "A compact launcher to throw things from inside or nearby tiles at a low enough velocity not to harm someone."
extended_desc = "The first and second inputs need to be numbers which correspond to the coordinates to throw objects at relative to the machine itself. \
The 'fire' activator will cause the mechanism to attempt to throw objects at the coordinates, if possible. Note that the \
projectile needs to be inside the machine, or on an adjacent tile, and must be medium sized or smaller. The assembly \
@@ -544,7 +337,7 @@
A.embedding = list("embed_chance" = 0)
//throw it
assembly.visible_message("[assembly] has thrown [A]!")
- log_attack("[assembly] [REF(assembly)] has thrown [A].")
+ log_attack("[assembly] [REF(assembly)] has thrown [A] with non-lethal force.")
A.forceMove(drop_location())
A.throw_at(locate(x_abs, y_abs, T.z), range, 3, , , , CALLBACK(src, .proc/post_throw, A))
@@ -813,4 +606,7 @@
set_pin_data(IC_OUTPUT, 1, assembly.detail_color)
push_data()
- activate_pin(3)
\ No newline at end of file
+ activate_pin(3)
+
+
+
diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm
index 0d8bf96afc..fb8fce10b2 100644
--- a/code/modules/integrated_electronics/subtypes/reagents.dm
+++ b/code/modules/integrated_electronics/subtypes/reagents.dm
@@ -548,9 +548,12 @@
desc = "Unlike most electronics, creating smoke is completely intentional."
icon_state = "smoke"
extended_desc = "This smoke generator creates clouds of smoke on command. It can also hold liquids inside, which will go \
- into the smoke clouds when activated. The reagents are consumed when the smoke is made."
+ into the smoke clouds when activated. The reagents are consumed when the smoke is made. Requires at least 10 units of reagents to generate smoke."
ext_cooldown = 1
+
volume = 100
+ container_type = OPENCONTAINER
+
complexity = 20
cooldown_per_use = 1 SECONDS
inputs = list()
@@ -573,6 +576,7 @@
if(changetype == ADD_REAGENT)
notified = FALSE
push_vol()
+
/obj/item/integrated_circuit/reagent/smoke/do_work(ord)
switch(ord)
if(1)
@@ -598,9 +602,10 @@
name = "integrated extinguisher"
desc = "This circuit sprays any of its contents out like an extinguisher."
icon_state = "injector"
- extended_desc = "This circuit can hold up to 30 units of any given chemicals. On each use, it sprays these reagents like a fire extinguisher."
+ extended_desc = "This circuit can hold up to 30 units of any given chemicals. On each use, it sprays these reagents like a fire extinguisher. Requires at least 10 units of reagents to work."
volume = 30
+ container_type = OPENCONTAINER
complexity = 20
cooldown_per_use = 6 SECONDS
@@ -631,7 +636,7 @@
/obj/item/integrated_circuit/reagent/extinguisher/do_work()
//Check if enough volume
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
- if(!reagents || reagents.total_volume < 5 || busy)
+ if(!reagents || reagents.total_volume < IC_SMOKE_REAGENTS_MINIMUM_UNITS || busy)
push_data()
activate_pin(3)
return
diff --git a/code/modules/integrated_electronics/subtypes/weaponized.dm b/code/modules/integrated_electronics/subtypes/weaponized.dm
new file mode 100644
index 0000000000..f9259359a3
--- /dev/null
+++ b/code/modules/integrated_electronics/subtypes/weaponized.dm
@@ -0,0 +1,343 @@
+/obj/item/integrated_circuit/weaponized
+ category_text = "Weaponized"
+
+/obj/item/integrated_circuit/weaponized/weapon_firing
+ name = "weapon firing mechanism"
+ desc = "This somewhat complicated system allows one to slot in a gun, direct it towards a position, and remotely fire it."
+ extended_desc = "The firing mechanism can slot in any energy weapon. \
+ The first and second inputs need to be numbers which correspond to coordinates for the gun to fire at relative to the machine itself. \
+ The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Mode will switch between \
+ lethal (TRUE) or stun (FALSE) modes. It uses the internal battery of the weapon itself, not the assembly. If you wish to fire the gun while the circuit is in \
+ hand, you will need to use an assembly that is a gun."
+ complexity = 20
+ w_class = WEIGHT_CLASS_SMALL
+ size = 3
+ inputs = list(
+ "target X rel" = IC_PINTYPE_NUMBER,
+ "target Y rel" = IC_PINTYPE_NUMBER,
+ "mode" = IC_PINTYPE_BOOLEAN
+ )
+ outputs = list("reference to gun" = IC_PINTYPE_REF)
+ activators = list(
+ "fire" = IC_PINTYPE_PULSE_IN
+
+ )
+ var/obj/item/gun/energy/installed_gun = null
+ spawn_flags = IC_SPAWN_RESEARCH
+ action_flags = IC_ACTION_COMBAT
+ power_draw_per_use = 0
+ ext_cooldown = 1
+ var/mode = FALSE
+
+ var/stun_projectile = null //stun mode projectile type
+ var/stun_projectile_sound
+ var/lethal_projectile = null //lethal mode projectile type
+ var/lethal_projectile_sound
+
+ demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
+
+
+
+/obj/item/integrated_circuit/weaponized/weapon_firing/Destroy()
+ qdel(installed_gun)
+ return ..()
+
+/obj/item/integrated_circuit/weaponized/weapon_firing/attackby(var/obj/O, var/mob/user)
+ if(istype(O, /obj/item/gun/energy))
+ var/obj/item/gun/gun = O
+ if(installed_gun)
+ to_chat(user, "There's already a weapon installed.")
+ return
+ user.transferItemToLoc(gun,src)
+ installed_gun = gun
+ var/list/gun_properties = gun.get_turret_properties()
+ to_chat(user, "You slide \the [gun] into the firing mechanism.")
+ playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
+ stun_projectile = gun_properties["stun_projectile"]
+ stun_projectile_sound = gun_properties["stun_projectile_sound"]
+ lethal_projectile = gun_properties["lethal_projectile"]
+ lethal_projectile_sound = gun_properties["lethal_projectile_sound"]
+ if(gun_properties["shot_delay"])
+ cooldown_per_use = gun_properties["shot_delay"]*10
+ if(cooldown_per_use<30)
+ cooldown_per_use = 30
+ if(gun_properties["reqpower"])
+ power_draw_per_use = gun_properties["reqpower"]
+ set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
+ push_data()
+ else
+ ..()
+
+/obj/item/integrated_circuit/weaponized/weapon_firing/attack_self(var/mob/user)
+ if(installed_gun)
+ installed_gun.forceMove(drop_location())
+ to_chat(user, "You slide \the [installed_gun] out of the firing mechanism.")
+ size = initial(size)
+ playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
+ installed_gun = null
+ set_pin_data(IC_OUTPUT, 1, WEAKREF(null))
+ push_data()
+ else
+ to_chat(user, "There's no weapon to remove from the mechanism.")
+
+/obj/item/integrated_circuit/weaponized/weapon_firing/do_work()
+ if(!installed_gun || !installed_gun.handle_pins())
+ return
+ if(!isturf(assembly.loc) && !(assembly.can_fire_equipped && ishuman(assembly.loc)))
+ return
+ set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
+ push_data()
+ var/datum/integrated_io/xo = inputs[1]
+ var/datum/integrated_io/yo = inputs[2]
+ var/datum/integrated_io/mode1 = inputs[3]
+
+ mode = mode1.data
+ if(assembly)
+ if(isnum(xo.data))
+ xo.data = round(xo.data, 1)
+ if(isnum(yo.data))
+ yo.data = round(yo.data, 1)
+
+ var/turf/T = get_turf(assembly)
+ var/target_x = CLAMP(T.x + xo.data, 0, world.maxx)
+ var/target_y = CLAMP(T.y + yo.data, 0, world.maxy)
+
+ assembly.visible_message("[assembly] fires [installed_gun]!")
+ shootAt(locate(target_x, target_y, T.z))
+
+/obj/item/integrated_circuit/weaponized/weapon_firing/proc/shootAt(turf/target)
+ var/turf/T = get_turf(src)
+ var/turf/U = target
+ if(!istype(T) || !istype(U))
+ return
+ if(!installed_gun.cell)
+ return
+ if(!installed_gun.cell.charge)
+ return
+ var/obj/item/ammo_casing/energy/shot = installed_gun.ammo_type[mode?2:1]
+ if(installed_gun.cell.charge < shot.e_cost)
+ return
+ if(!shot)
+ return
+ update_icon()
+ var/obj/item/projectile/A
+ if(!mode)
+ A = new stun_projectile(T)
+ playsound(loc, stun_projectile_sound, 75, 1)
+ else
+ A = new lethal_projectile(T)
+ playsound(loc, lethal_projectile_sound, 75, 1)
+ installed_gun.cell.use(shot.e_cost)
+ //Shooting Code:
+ A.preparePixelProjectile(target, src)
+ A.fire()
+ log_attack("[assembly] [REF(assembly)] has fired [installed_gun].")
+ return A
+
+/obj/item/integrated_circuit/weaponized/grenade
+ name = "grenade primer"
+ desc = "This circuit comes with the ability to attach most types of grenades and prime them at will."
+ extended_desc = "The time between priming and detonation is limited to between 1 to 12 seconds, but is optional. \
+ If the input is not set, not a number, or a number less than 1, the grenade's built-in timing will be used. \
+ Beware: Once primed, there is no aborting the process!"
+ icon_state = "grenade"
+ complexity = 30
+ cooldown_per_use = 10
+ inputs = list("detonation time" = IC_PINTYPE_NUMBER)
+ outputs = list()
+ activators = list("prime grenade" = IC_PINTYPE_PULSE_IN)
+ spawn_flags = IC_SPAWN_RESEARCH
+ action_flags = IC_ACTION_COMBAT
+ var/obj/item/grenade/attached_grenade
+ var/pre_attached_grenade_type
+ demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
+
+/obj/item/integrated_circuit/weaponized/grenade/Initialize()
+ . = ..()
+ if(pre_attached_grenade_type)
+ var/grenade = new pre_attached_grenade_type(src)
+ attach_grenade(grenade)
+
+/obj/item/integrated_circuit/weaponized/grenade/Destroy()
+ if(attached_grenade && !attached_grenade.active)
+ attached_grenade.forceMove(loc)
+ detach_grenade()
+ return ..()
+
+/obj/item/integrated_circuit/weaponized/grenade/attackby(var/obj/item/grenade/G, var/mob/user)
+ if(istype(G))
+ if(attached_grenade)
+ to_chat(user, "There is already a grenade attached!")
+ else if(user.transferItemToLoc(G,src))
+ user.visible_message("\The [user] attaches \a [G] to \the [src]!", "You attach \the [G] to \the [src].")
+ attach_grenade(G)
+ G.forceMove(src)
+ else
+ return ..()
+
+/obj/item/integrated_circuit/weaponized/grenade/attack_self(var/mob/user)
+ if(attached_grenade)
+ user.visible_message("\The [user] removes \an [attached_grenade] from \the [src]!", "You remove \the [attached_grenade] from \the [src].")
+ user.put_in_hands(attached_grenade)
+ detach_grenade()
+ else
+ return ..()
+
+/obj/item/integrated_circuit/weaponized/grenade/do_work()
+ if(attached_grenade && !attached_grenade.active)
+ var/datum/integrated_io/detonation_time = inputs[1]
+ var/dt
+ if(isnum(detonation_time.data) && detonation_time.data > 0)
+ dt = CLAMP(detonation_time.data, 1, 12)*10
+ else
+ dt = 15
+ addtimer(CALLBACK(attached_grenade, /obj/item/grenade.proc/prime), dt)
+ var/atom/holder = loc
+ message_admins("activated a grenade assembly. Last touches: Assembly: [holder.fingerprintslast] Circuit: [fingerprintslast] Grenade: [attached_grenade.fingerprintslast]")
+
+// These procs do not relocate the grenade, that's the callers responsibility
+/obj/item/integrated_circuit/weaponized/grenade/proc/attach_grenade(var/obj/item/grenade/G)
+ attached_grenade = G
+ G.forceMove(src)
+ desc += " \An [attached_grenade] is attached to it!"
+
+/obj/item/integrated_circuit/weaponized/grenade/proc/detach_grenade()
+ if(!attached_grenade)
+ return
+ attached_grenade.forceMove(drop_location())
+ attached_grenade = null
+ desc = initial(desc)
+
+/obj/item/integrated_circuit/weaponized/air_cannon
+ name = "pneumatic cannon"
+ desc = "A compact pneumatic cannon to throw things from inside or nearby tiles at a high enough velocity to cause damage. Requires air from a canister to fire."
+ extended_desc = "The first and second inputs need to be numbers which correspond to the coordinates to throw objects at relative to the machine itself. \
+ The 'fire' activator will cause the mechanism to attempt to launch objects at the coordinates, if possible. Note that the \
+ projectile needs to be inside the machine, or on an adjacent tile, and must be medium sized or smaller. The assembly \
+ must also be a gun if you wish to launch something while the assembly is in hand."
+ complexity = 75
+ w_class = WEIGHT_CLASS_SMALL
+ size = 4
+ cooldown_per_use = 30
+ ext_cooldown = 15
+ inputs = list(
+ "target X rel" = IC_PINTYPE_NUMBER,
+ "target Y rel" = IC_PINTYPE_NUMBER,
+ "projectile" = IC_PINTYPE_REF,
+ "canister" = IC_PINTYPE_REF
+ )
+ outputs = list()
+ activators = list(
+ "fire" = IC_PINTYPE_PULSE_IN
+ )
+ spawn_flags = IC_SPAWN_RESEARCH
+ action_flags = IC_ACTION_COMBAT
+ power_draw_per_use = 50
+ var/gas_per_throw = 6
+
+/obj/item/integrated_circuit/weaponized/air_cannon/do_work()
+
+ var/max_w_class = assembly.w_class
+ var/target_x_rel = round(get_pin_data(IC_INPUT, 1))
+ var/target_y_rel = round(get_pin_data(IC_INPUT, 2))
+ var/obj/item/A = get_pin_data_as_type(IC_INPUT, 3, /obj/item)
+ var/obj/item/integrated_circuit/atmospherics/AT = get_pin_data_as_type(IC_INPUT, 4, /obj/item/integrated_circuit/atmospherics)
+
+ if(!A || A.anchored || A.throwing || A == assembly || istype(A, /obj/item/twohanded) || istype(A, /obj/item/transfer_valve))
+ return
+
+ if(!AT || !AT.air_contents)
+ return
+
+ if (istype(assembly.loc, /obj/item/implant/storage)) //Prevents the more abusive form of chestgun.
+ return
+
+ if(max_w_class && (A.w_class > max_w_class))
+ return
+
+ if(!assembly.can_fire_equipped && ishuman(assembly.loc))
+ return
+
+ // Is the target inside the assembly or close to it?
+ if(!check_target(A, exclude_components = TRUE))
+ return
+
+ var/turf/T = get_turf(get_object())
+ if(!T)
+ return
+
+ // If the item is in mob's inventory, try to remove it from there.
+ if(ismob(A.loc))
+ var/mob/living/M = A.loc
+ if(!M.temporarilyRemoveItemFromInventory(A))
+ return
+
+ var/datum/gas_mixture/source_air = AT.return_air()
+ var/datum/gas_mixture/target_air = T.return_air()
+
+ if(!source_air || !target_air)
+ return
+
+ var/datum/gas_mixture/removed = source_air.remove(gas_per_throw)
+ if(!removed)
+ return
+ target_air.merge(removed)
+
+ // If the item is in a grabber circuit we'll update the grabber's outputs after we've thrown it.
+ var/obj/item/integrated_circuit/manipulation/grabber/G = A.loc
+
+ var/x_abs = CLAMP(T.x + target_x_rel, 0, world.maxx)
+ var/y_abs = CLAMP(T.y + target_y_rel, 0, world.maxy)
+ var/range = round(CLAMP(sqrt(target_x_rel*target_x_rel+target_y_rel*target_y_rel),0,8),1)
+ assembly.visible_message("\The [assembly] has thrown [A]!")
+ log_attack("[assembly] [REF(assembly)] has thrown [A] with lethal force.")
+ A.forceMove(drop_location())
+ A.throw_at(locate(x_abs, y_abs, T.z), range, 3)
+
+ air_update_turf()
+
+ // If the item came from a grabber now we can update the outputs since we've thrown it.
+ if(istype(G))
+ G.update_outputs()
+
+
+/obj/item/integrated_circuit/weaponized/stun
+ name = "electronic stun module"
+ desc = "Used to stun a target holding the device via electricity."
+ icon_state = "power_relay"
+ extended_desc = "Attempts to stun the holder of this device, with the strength input being the strength of the stun, from 1 to 70."
+ complexity = 60
+ size = 4
+ inputs = list("strength" = IC_PINTYPE_NUMBER)
+ activators = list("stun" = IC_PINTYPE_PULSE_IN, "on success" = IC_PINTYPE_PULSE_OUT, "on fail" = IC_PINTYPE_PULSE_OUT)
+ spawn_flags = IC_SPAWN_RESEARCH
+ power_draw_per_use = 2000
+ cooldown_per_use = 50
+ ext_cooldown = 25
+
+
+/obj/item/integrated_circuit/weaponized/stun/do_work()
+ var/stunforce = CLAMP(get_pin_data(IC_INPUT, 1),1,70)
+ var/mob/living/L = assembly.loc
+ if(attempt_stun(L,stunforce))
+ activate_pin(2)
+ else
+ activate_pin(3)
+
+/obj/item/integrated_circuit/weaponized/proc/attempt_stun(var/mob/living/L,var/stunforce = 70) //Copied from stunbaton code.
+
+ if(!L || !isliving(L))
+ return 0
+
+ L.Knockdown(stunforce)
+ SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
+
+ message_admins("stunned someone with an assembly. Last touches: Assembly: [assembly.fingerprintslast] Circuit: [fingerprintslast]")
+
+ L.visible_message("\The [assembly] has stunned \the [L] with \the [src]!", "\The [assembly] has stunned you with \the [src]!")
+ playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ H.forcesay(GLOB.hit_appends)
+
+ return 1
\ No newline at end of file
diff --git a/code/modules/jobs/job_types/cargo_service.dm b/code/modules/jobs/job_types/cargo_service.dm
index 053373c05a..22ef2a9211 100644
--- a/code/modules/jobs/job_types/cargo_service.dm
+++ b/code/modules/jobs/job_types/cargo_service.dm
@@ -110,7 +110,7 @@ Shaft Miner
/datum/outfit/job/miner/equipped
name = "Shaft Miner (Lavaland + Equipment)"
- suit = /obj/item/clothing/suit/hooded/explorer
+ suit = /obj/item/clothing/suit/hooded/explorer/standard
mask = /obj/item/clothing/mask/gas/explorer
glasses = /obj/item/clothing/glasses/meson
suit_store = /obj/item/tank/internals/oxygen
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index dec574566f..2c35c3148f 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -15,6 +15,7 @@
resistance_flags = FIRE_PROOF
tauric = TRUE //Citadel Add for tauric hardsuits
+
/obj/item/clothing/head/hooded/explorer
name = "explorer hood"
desc = "An armoured hood for exploring harsh environments."
@@ -26,11 +27,15 @@
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
resistance_flags = FIRE_PROOF
-/obj/item/clothing/suit/hooded/explorer/Initialize()
+/obj/item/clothing/suit/hooded/explorer/standard
+
+/obj/item/clothing/head/hooded/explorer/standard
+
+/obj/item/clothing/suit/hooded/explorer/standard/Initialize()
. = ..()
AddComponent(/datum/component/armor_plate)
-/obj/item/clothing/head/hooded/explorer/Initialize()
+/obj/item/clothing/head/hooded/explorer/standard/Initialize()
. = ..()
AddComponent(/datum/component/armor_plate)
@@ -176,4 +181,4 @@
desc = "A face-covering mask that can be connected to an air supply. Intended for use with the Exosuit."
icon_state = "exo"
item_state = "exo"
- resistance_flags = FIRE_PROOF
\ No newline at end of file
+ resistance_flags = FIRE_PROOF
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index cd75c3b55b..aed90cebdf 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -319,7 +319,7 @@
new /obj/item/clothing/glasses/meson(src)
new /obj/item/t_scanner/adv_mining_scanner/lesser(src)
new /obj/item/storage/bag/ore(src)
- new /obj/item/clothing/suit/hooded/explorer(src)
+ new /obj/item/clothing/suit/hooded/explorer/standard(src)
new /obj/item/encryptionkey/headset_cargo(src)
new /obj/item/clothing/mask/gas/explorer(src)
new /obj/item/card/mining_access_card(src)
@@ -340,7 +340,7 @@
new /obj/item/storage/firstaid/regular(src)
new /obj/item/reagent_containers/hypospray/medipen/survival(src)
new /obj/item/t_scanner/adv_mining_scanner(src)
- new /obj/item/clothing/suit/hooded/explorer(src)
+ new /obj/item/clothing/suit/hooded/explorer/standard(src)
new /obj/item/encryptionkey/headset_cargo(src)
new /obj/item/clothing/mask/gas/explorer(src)
new /obj/item/card/id/mining(src)
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 950ac5fb8b..d1d5fb7cd4 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -39,6 +39,19 @@
restraint_check = TRUE
emote_type = EMOTE_AUDIBLE
+/datum/emote/living/carbon/human/mawp
+ key = "mawp"
+ key_third_person = "mawps"
+ message = "mawps annoyingly."
+ emote_type = EMOTE_AUDIBLE
+
+/datum/emote/living/carbon/human/mawp/run_emote(mob/living/user, params)
+ . = ..()
+ if(.)
+ if(ishuman(user))
+ if(prob(10))
+ user.adjustEarDamage(-5, -5)
+
/datum/emote/living/carbon/human/mumble
key = "mumble"
key_third_person = "mumbles"
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index dc35e65c47..7ce3f78da0 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -1,11 +1,11 @@
/mob/living/carbon/human/say_mod(input, message_mode)
verb_say = dna.species.say_mod
switch(slurring)
- if(25 to 50)
+ if(10 to 25)
return "jumbles"
- if(50 to 75)
+ if(25 to 50)
return "slurs"
- if(75 to INFINITY)
+ if(50 to INFINITY)
return "garbles"
else
. = ..()
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index ba1ad9e0da..e2e9e5149f 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -755,6 +755,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(!(H.has_trait(TRAIT_HUSK)))
if(!forced_colour)
switch(S.color_src)
+ if(SKINTONE)
+ accessory_overlay.color = skintone2hex(H.skin_tone)
if(MUTCOLORS)
if(fixed_mut_color)
accessory_overlay.color = "#[fixed_mut_color]"
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 6111a92e99..e757e6dcf4 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -531,7 +531,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
if(stuttering)
stuttering = max(stuttering-1, 0)
- if(slurring)
+ if(slurring || drunkenness)
slurring = max(slurring-1,0,drunkenness)
if(cultslurring)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index 12c98b8b5d..82f85766c2 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -290,7 +290,7 @@
gloves = /obj/item/clothing/gloves/color/black
mask = /obj/item/clothing/mask/gas/explorer
if(prob(20))
- suit = pickweight(list(/obj/item/clothing/suit/hooded/explorer = 6, /obj/item/clothing/suit/hooded/cloak/goliath = 2, /obj/item/clothing/suit/hooded/explorer/exo = 6, /obj/item/clothing/suit/hooded/explorer/seva = 6))
+ suit = pickweight(list(/obj/item/clothing/suit/hooded/explorer/standard = 6, /obj/item/clothing/suit/hooded/cloak/goliath = 2, /obj/item/clothing/suit/hooded/explorer/exo = 6, /obj/item/clothing/suit/hooded/explorer/seva = 6))
if(prob(30))
r_pocket = pickweight(list(/obj/item/stack/marker_beacon = 20, /obj/item/stack/spacecash/c1000 = 7, /obj/item/reagent_containers/hypospray/medipen/survival = 2, /obj/item/borg/upgrade/modkit/damage = 1 ))
if(prob(10))
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 3d4e356464..776bd04935 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -65,6 +65,7 @@
return sanitize(t)
/proc/slur(n,var/strength=50)
+ strength = min(strength,50)
var/phrase = html_decode(n)
var/leng = lentext(phrase)
var/counter=lentext(phrase)
@@ -72,7 +73,7 @@
var/newletter=""
while(counter>=1)
newletter=copytext(phrase,(leng-counter)+1,(leng-counter)+2)
- if(rand(1,100)<=strength)
+ if(rand(1,100)<=strength*0.5)
if(lowertext(newletter)=="o")
newletter="u"
if(lowertext(newletter)=="s")
@@ -83,12 +84,12 @@
newletter="oo"
if(lowertext(newletter)=="c")
newletter="k"
- if(rand(1,100) <= strength*0.5)
+ if(rand(1,100) <= strength*0.25)
if(newletter==" ")
newletter="...huuuhhh..."
if(newletter==".")
newletter=" *BURP*."
- if(rand(1,100) <= strength)
+ if(rand(1,100) <= strength*0.5)
if(rand(1,5) == 1)
newletter+="'"
if(rand(1,5) == 1)
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 4e97d0a9b3..cd0dd53d48 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -42,6 +42,7 @@
/obj/item/gun/energy/laser/carbine
name = "laser carbine"
desc = "A ruggedized laser carbine featuring much higher capacity and improved handling when compared to a normal laser gun."
+ icon = 'icons/obj/guns/energy.dmi'
icon_state = "lasernew"
item_state = "laser"
force = 10
@@ -50,6 +51,9 @@
cell_type = /obj/item/stock_parts/cell/lascarbine
resistance_flags = FIRE_PROOF | ACID_PROOF
+/obj/item/gun/energy/laser/carbine/nopin
+ pin = null
+
/obj/item/gun/energy/laser/captain/scattershot
name = "scatter shot laser rifle"
icon_state = "lasercannon"
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 15a2ef1cba..5d1593d1e7 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -1863,3 +1863,20 @@
description = "The primary precursor for an ancient feline delicacy known as skooma. While it has no notable effects on it's own, mixing it with morphine in a chilled container may yield interesting results."
color = "#FAEAFF"
taste_description = "synthetic catnip"
+
+/datum/reagent/penis_enlargement
+ name = "Penis Enlargement"
+ id = "penis_enlargement"
+ description = "A patented chemical forumula by Doctor Ronald Hyatt that is guaranteed to bring maximum GROWTH and LENGTH to your penis, today!"
+ color = "#888888"
+ taste_description = "chinese dragon powder"
+ metabolization_rate = INFINITY //So it instantly removes all of itself. Don't want to put strain on the system.
+
+/datum/reagent/penis_enlargement/on_mob_life(mob/living/carbon/C)
+ var/obj/item/organ/genital/penis/P = C.getorganslot(ORGAN_SLOT_PENIS)
+ if(P)
+ var/added_length = round(volume/30,0.01) //Every 30u gives an extra inch. Rounded to the nearest 0.01 so float fuckery doesn't occur with the division by 30.
+ if(added_length >= 0.20) //Only add the length if it's greater than or equal to 0.2. This is to prevent people from smoking the reagents and causing the penis to update constantly.
+ P.length += added_length
+ P.update()
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 26edcb5b73..7286f01623 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -759,6 +759,7 @@
taste_description = "skewing"
/datum/reagent/toxin/skewium/on_mob_life(mob/living/carbon/M)
+ /*
if(M.hud_used)
if(current_cycle >= 5 && current_cycle % 3 == 0)
var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"])
@@ -774,6 +775,7 @@
for(var/whole_screen in screens)
animate(whole_screen, transform = newmatrix, time = 5, easing = QUAD_EASING, loop = -1)
animate(transform = -newmatrix, time = 5, easing = QUAD_EASING)
+ */
return ..()
/datum/reagent/toxin/skewium/on_mob_delete(mob/living/M)
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index 38d47d5185..ed2ca66aae 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -233,3 +233,7 @@
/obj/item/reagent_containers/pill/get_belt_overlay()
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "pouch")
+
+/obj/item/reagent_containers/pill/penis_enlargement
+ name = "penis enlargement pill"
+ list_reagents = list("penis_enlargement" = 30)
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 7ceeda2c64..173fd5a813 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -870,3 +870,19 @@
materials = list(MAT_METAL = 100, MAT_GLASS = 100)
build_path = /obj/item/disk/holodisk
category = list("initial", "Misc")
+
+/datum/design/lock_collar
+ name = "Lockable Collar"
+ id = "lock_collar"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 1200, MAT_GLASS = 100)
+ build_path = /obj/item/clothing/neck/petcollar/locked
+ category = list("initial", "Misc")
+
+/datum/design/collar_key
+ name = "Collar Key"
+ id = "collar_key"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 300, MAT_GLASS = 150)
+ build_path = /obj/item/key/collar
+ category = list("initial", "Misc")
diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm
index 2dc0ed77b3..c9d11a5a3e 100644
--- a/code/modules/research/designs/bluespace_designs.dm
+++ b/code/modules/research/designs/bluespace_designs.dm
@@ -24,6 +24,17 @@
dangerous_construction = TRUE
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+/datum/design/satchel_holding
+ name = "Satchel of Holding"
+ desc = "A satchel that opens into a localized pocket of bluespace."
+ id = "satchel_holding"
+ build_type = PROTOLATHE
+ materials = list(MAT_GOLD = 3000, MAT_DIAMOND = 1500, MAT_URANIUM = 250, MAT_BLUESPACE = 2000)
+ build_path = /obj/item/storage/backpack/holding/satchel
+ category = list("Bluespace Designs")
+ dangerous_construction = TRUE
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
/datum/design/biobag_holding
name = "Bio Bag of Holding"
desc = "A chemical holding thingy. Mostly used for xenobiology."
diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm
index e1648559a7..f8122c16e3 100644
--- a/code/modules/research/designs/power_designs.dm
+++ b/code/modules/research/designs/power_designs.dm
@@ -77,6 +77,16 @@
category = list("Power Designs")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
+/datum/design/inducercombat
+ name = "Combat Ready Inducer"
+ desc = "The improved NT-8475 Electromagnetic Power Inducer can this one has been SCIENCED to allow for combat. It still comes printed with SCIENCED colors!"
+ id = "combatinducer"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 13000, MAT_GLASS = 10000, MAT_SILVER = 1500, MAT_GOLD = 1250, MAT_DIAMOND = 500, MAT_TITANIUM = 1200)
+ build_path = /obj/item/inducer/sci/combat/dry
+ category = list("Power Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
/datum/design/board/pacman
name = "Machine Design (PACMAN-type Generator Board)"
desc = "The circuit board that for a PACMAN-type portable generator."
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 4e31fe50a9..03c0582245 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -145,7 +145,7 @@
id = "lasercarbine"
build_type = PROTOLATHE
materials = list(MAT_METAL = 15000, MAT_GLASS = 10000, MAT_GOLD = 2500, MAT_SILVER = 2500)
- build_path = /obj/item/gun/energy/laser/carbine
+ build_path = /obj/item/gun/energy/laser/carbine/nopin
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 99ee820ff6..aa091d181c 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -246,7 +246,7 @@
display_name = "Bluespace Pockets"
description = "Studies into the mysterious alternate dimension known as bluespace and how to place items in the threads of reality."
prereq_ids = list("adv_power", "adv_bluespace", "adv_biotech", "adv_plasma")
- design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash")
+ design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash", "satchel_holding")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5500)
export_price = 5000
/////////////////////////plasma tech/////////////////////////
@@ -428,7 +428,7 @@
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
export_price = 5000
design_ids = list("s-receiver", "s-bus", "s-broadcaster", "s-processor", "s-hub", "s-server", "s-relay", "comm_monitor", "comm_server",
- "s-ansible", "s-filter", "s-amplifier", "ntnet_relay", "s-treatment", "s-analyzer", "s-crystal", "s-transmitter")
+ "s-ansible", "s-filter", "s-amplifier", "ntnet_relay", "s-treatment", "s-analyzer", "s-crystal", "s-transmitter", "message_monitor")
/datum/techweb_node/integrated_HUDs
id = "integrated_HUDs"
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index f394351285..dfdf0fde69 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -45,7 +45,8 @@
var/species_color = ""
var/mutation_color = ""
var/no_update = 0
- var/body_markings //for bodypart markings
+ var/body_markings = "" //for bodypart markings
+ var/body_markings_icon = 'modular_citadel/icons/mob/mam_markings.dmi'
var/list/markings_color = list()
var/auxmarking
var/list/auxmarking_color = list()
@@ -260,6 +261,7 @@
icon = DEFAULT_BODYPART_ICON_ORGANIC
else if(status == BODYPART_ROBOTIC)
icon = DEFAULT_BODYPART_ICON_ROBOTIC
+ body_markings = null
if(owner)
owner.updatehealth()
@@ -332,14 +334,18 @@
species_color = ""
if("mam_body_markings" in S.default_features)
+ var/datum/sprite_accessory/Smark
+ Smark = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]]
if(H.dna.features.["mam_body_markings"] != "None")
+ body_markings_icon = Smark.icon
body_markings = lowertext(H.dna.features.["mam_body_markings"])
if(MATRIXED)
markings_color = list(colorlist)
else
+ body_markings = "plain"
markings_color = (H.dna.features.["mcolor"])
else
- body_markings = "None"
+ body_markings = null
markings_color = ""
if(!dropping_limb && H.dna.check_mutation(HULK))
@@ -354,6 +360,7 @@
if(status == BODYPART_ROBOTIC)
dmg_overlay_type = "robotic"
+ body_markings = null
if(dropping_limb)
no_update = TRUE //when attached, the limb won't be affected by the appearance changes of its mob owner.
@@ -385,11 +392,11 @@
. += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_[brutestate]0", -DAMAGE_LAYER, image_dir)
if(burnstate)
. += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_0[burnstate]", -DAMAGE_LAYER, image_dir)
- if(body_markings)
+ if(body_markings && status != BODYPART_ROBOTIC)
if(use_digitigrade == NOT_DIGITIGRADE)
- . += image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
+ . += image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
else
- . += image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+ . += image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir)
var/image/aux
@@ -442,14 +449,14 @@
// Body markings
if(body_markings)
if(species_id == "husk")
- marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
+ marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
else if(species_id == "husk" && use_digitigrade)
- marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+ marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
else if(!use_digitigrade)
- marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
+ marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
else
- marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+ marking = image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
. += marking
// Citadel End
@@ -459,9 +466,9 @@
. += aux
if(body_markings)
if(species_id == "husk")
- auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
+ auxmarking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
else
- auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[aux_zone]", -aux_layer, image_dir)
+ auxmarking = image(body_markings_icon, "[body_markings]_[aux_zone]", -aux_layer, image_dir)
. += auxmarking
else
@@ -475,21 +482,21 @@
. += aux
if(body_markings)
if(species_id == "husk")
- auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
+ auxmarking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
else
- auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[aux_zone]", -aux_layer, image_dir)
+ auxmarking = image(body_markings_icon, "[body_markings]_[aux_zone]", -aux_layer, image_dir)
. += auxmarking
if(body_markings)
if(species_id == "husk")
- marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
+ marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
else if(species_id == "husk" && use_digitigrade)
- marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+ marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
else if(!use_digitigrade)
- marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
+ marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
else
- marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+ marking = image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
. += marking
return
diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm
index 9cc56a6ca8..a2e8017956 100644
--- a/code/modules/surgery/bodyparts/helpers.dm
+++ b/code/modules/surgery/bodyparts/helpers.dm
@@ -178,6 +178,7 @@
L.update_limb(fixed_icon, src)
if(robotic)
L.change_bodypart_status(BODYPART_ROBOTIC)
+ L.body_markings = null
. = L
/mob/living/carbon/monkey/newBodyPart(zone, robotic, fixed_icon)
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index af2c625670..702ddb71a3 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -1438,6 +1438,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 20
restricted_roles = list("Assistant")
+/datum/uplink_item/role_restricted/goldenbox
+ name = "Gold Toolbox"
+ desc = "A gold planted plastitanium toolbox loaded with tools. Comes with a set of AI detection multi-tool and a pare of combat gloves."
+ item = /obj/item/storage/toolbox/gold_real
+ cost = 5 // Has synda tools + gloves + a robust weapon
+ restricted_roles = list("Assistant", "Curator") //Curator do to being made of gold - It fits the theme
+
/datum/uplink_item/role_restricted/brainwash_disk
name = "Brainwashing Surgery Program"
desc = "A disk containing the procedure to perform a brainwashing surgery, allowing you to implant an objective onto a target. \
diff --git a/html/changelogs/AutoChangeLog-pr-8278.yml b/html/changelogs/AutoChangeLog-pr-8278.yml
new file mode 100644
index 0000000000..57655b8ace
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8278.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Armor to blob shields"
+ - tweak: "block weaken state to 70% from 75%"
diff --git a/html/changelogs/AutoChangeLog-pr-8305.yml b/html/changelogs/AutoChangeLog-pr-8305.yml
new file mode 100644
index 0000000000..2293fa9163
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8305.yml
@@ -0,0 +1,4 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - server: "Discord bot will now report when a round ends and give the vague news ticker that a sister-station would have received for the game mode and result of the round."
diff --git a/html/changelogs/AutoChangeLog-pr-8306.yml b/html/changelogs/AutoChangeLog-pr-8306.yml
new file mode 100644
index 0000000000..95ceb32968
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8306.yml
@@ -0,0 +1,6 @@
+author: "Poojawa"
+delete-after: True
+changes:
+ - bugfix: "fixed medical hardsuit overlay issue. I thought it was going to work well but fuck byond."
+ - bugfix: "None body markings shouldn't give rgb hell, but it also should reset properly anyway. ree."
+ - bugfix: "Sorted some sprites to better sooth my byond icon limit anxiety."
diff --git a/html/changelogs/AutoChangeLog-pr-8315.yml b/html/changelogs/AutoChangeLog-pr-8315.yml
new file mode 100644
index 0000000000..5d0b85e162
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8315.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - bugfix: "laser carbine"
diff --git a/html/changelogs/AutoChangeLog-pr-8316.yml b/html/changelogs/AutoChangeLog-pr-8316.yml
new file mode 100644
index 0000000000..b51a40c846
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8316.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "makes collars only locked via key"
diff --git a/html/changelogs/AutoChangeLog-pr-8317.yml b/html/changelogs/AutoChangeLog-pr-8317.yml
new file mode 100644
index 0000000000..0fd31c3c52
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8317.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - tweak: "Biogenerators now have a sane limit for production"
diff --git a/html/changelogs/AutoChangeLog-pr-8318.yml b/html/changelogs/AutoChangeLog-pr-8318.yml
new file mode 100644
index 0000000000..0c0a5c06c4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8318.yml
@@ -0,0 +1,4 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - rscadd: "Adds additional random brain damage text"
diff --git a/html/changelogs/AutoChangeLog-pr-8319.yml b/html/changelogs/AutoChangeLog-pr-8319.yml
new file mode 100644
index 0000000000..e46b83c121
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8319.yml
@@ -0,0 +1,4 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - rscadd: "Adds penis enlargement pills."
diff --git a/html/changelogs/AutoChangeLog-pr-8322.yml b/html/changelogs/AutoChangeLog-pr-8322.yml
new file mode 100644
index 0000000000..188c988021
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8322.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "charging"
diff --git a/html/changelogs/AutoChangeLog-pr-8323.yml b/html/changelogs/AutoChangeLog-pr-8323.yml
new file mode 100644
index 0000000000..0c4fc13b48
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8323.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Combat inducers for COMBAT!"
diff --git a/html/changelogs/AutoChangeLog-pr-8334.yml b/html/changelogs/AutoChangeLog-pr-8334.yml
new file mode 100644
index 0000000000..3c9152c257
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8334.yml
@@ -0,0 +1,4 @@
+author: "dtfe3"
+delete-after: True
+changes:
+ - tweak: "Increased music maxlines from 300 to 600"
diff --git a/html/changelogs/AutoChangeLog-pr-8336.yml b/html/changelogs/AutoChangeLog-pr-8336.yml
new file mode 100644
index 0000000000..25a14e5d1f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8336.yml
@@ -0,0 +1,5 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - rscadd: "Adds Stun Circuit and Pneumatic Cannon Integrated Circuits"
+ - bugfix: "Fixed extinguisher and smoke circuits not accepting any reagents."
diff --git a/html/changelogs/AutoChangeLog-pr-8341.yml b/html/changelogs/AutoChangeLog-pr-8341.yml
new file mode 100644
index 0000000000..50dedb7374
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8341.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "golden swag boxes"
diff --git a/html/changelogs/AutoChangeLog-pr-8342.yml b/html/changelogs/AutoChangeLog-pr-8342.yml
new file mode 100644
index 0000000000..a159f3240f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8342.yml
@@ -0,0 +1,7 @@
+author: "BurgerBB"
+delete-after: True
+changes:
+ - rscadd: "Adds a few important clockcult tips."
+ - rscadd: "Added Mech Sensors, a brass-created trap that activates when a mech not controlled by a cultist crosses it."
+ - rscadd: "Added power nullifiers, an emp trap that emps everything in a 3x3 area, with the center suffering a heavy EMP."
+ - tweak: "Brass Skewers now deal 50 damage to mechs."
diff --git a/html/changelogs/AutoChangeLog-pr-8352.yml b/html/changelogs/AutoChangeLog-pr-8352.yml
new file mode 100644
index 0000000000..ff9e9130db
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8352.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - bugfix: "Fixed a fairly huge server crash exploit"
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 90c7e42c8e..6099a3f037 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi
index a8d2a2aef3..50c143b9cb 100644
Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ
diff --git a/icons/mob/inhands/equipment/backpack_lefthand.dmi b/icons/mob/inhands/equipment/backpack_lefthand.dmi
index c37d12e2c0..0e466486c5 100644
Binary files a/icons/mob/inhands/equipment/backpack_lefthand.dmi and b/icons/mob/inhands/equipment/backpack_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/backpack_righthand.dmi b/icons/mob/inhands/equipment/backpack_righthand.dmi
index 08e05e055e..1c265a4137 100644
Binary files a/icons/mob/inhands/equipment/backpack_righthand.dmi and b/icons/mob/inhands/equipment/backpack_righthand.dmi differ
diff --git a/icons/obj/assemblies/electronic_setups.dmi b/icons/obj/assemblies/electronic_setups.dmi
index 58ef0903be..5804c3f8ab 100644
Binary files a/icons/obj/assemblies/electronic_setups.dmi and b/icons/obj/assemblies/electronic_setups.dmi differ
diff --git a/icons/obj/clockwork_objects.dmi b/icons/obj/clockwork_objects.dmi
index 5b8fc246cb..56cfdf468b 100644
Binary files a/icons/obj/clockwork_objects.dmi and b/icons/obj/clockwork_objects.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 0c9155827b..d6ffc12ae7 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index 1454d17a16..8f6b844a23 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm
index 18c4d44f13..f6b9f1d999 100644
--- a/modular_citadel/code/modules/arousal/organs/penis.dm
+++ b/modular_citadel/code/modules/arousal/organs/penis.dm
@@ -4,7 +4,7 @@
icon_state = "penis"
icon = 'modular_citadel/icons/obj/genitals/penis.dmi'
zone = "groin"
- slot = "penis"
+ slot = ORGAN_SLOT_PENIS
w_class = 3
can_masturbate_with = TRUE
masturbation_verb = "stroke"
diff --git a/modular_citadel/code/modules/client/loadout/head.dm b/modular_citadel/code/modules/client/loadout/head.dm
index 1ef203d538..bd26f44482 100644
--- a/modular_citadel/code/modules/client/loadout/head.dm
+++ b/modular_citadel/code/modules/client/loadout/head.dm
@@ -56,25 +56,34 @@
//trek fancy Hats!
/datum/gear/trekcap
- name = "Federation Officer's Cap"
+ name = "Federation Officer's Cap (White)"
category = SLOT_HEAD
path = /obj/item/clothing/head/caphat/formal/fedcover
restricted_roles = list("Captain","Head of Personnel")
+/datum/gear/trekcapcap
+ name = "Federation Officer's Cap (Black)"
+ category = SLOT_HEAD
+ path = /obj/item/clothing/head/caphat/formal/fedcover/black
+ restricted_roles = list("Captain","Head of Personnel")
+
/datum/gear/trekcapmedisci
- name = "Federation Officer's Cap"
+ name = "Federation Officer's Cap (Blue)"
category = SLOT_HEAD
path = /obj/item/clothing/head/caphat/formal/fedcover/medsci
+ restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekcapeng
- name = "Federation Officer's Cap"
+ name = "Federation Officer's Cap (Yellow)"
category = SLOT_HEAD
path = /obj/item/clothing/head/caphat/formal/fedcover/eng
+ restricted_desc = "Engineering, Security, and Cargo"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
/datum/gear/trekcapsec
- name = "Federation Officer's Cap"
+ name = "Federation Officer's Cap (Red)"
category = SLOT_HEAD
path = /obj/item/clothing/head/caphat/formal/fedcover/sec
+ restricted_desc = "Engineering, Security, and Cargo"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
\ No newline at end of file
diff --git a/modular_citadel/code/modules/client/loadout/loadout.dm b/modular_citadel/code/modules/client/loadout/loadout.dm
index 52e4f86dbe..2e11519d0b 100644
--- a/modular_citadel/code/modules/client/loadout/loadout.dm
+++ b/modular_citadel/code/modules/client/loadout/loadout.dm
@@ -52,6 +52,7 @@ GLOBAL_LIST_EMPTY(loadout_whitelist_ids)
var/geargroupID //defines the ID that the gear inherits from the config
var/list/restricted_roles
var/list/ckeywhitelist
+ var/restricted_desc
/datum/gear/New()
..()
diff --git a/modular_citadel/code/modules/client/loadout/suit.dm b/modular_citadel/code/modules/client/loadout/suit.dm
index 9d3a6b9a02..5a12a6bf0b 100644
--- a/modular_citadel/code/modules/client/loadout/suit.dm
+++ b/modular_citadel/code/modules/client/loadout/suit.dm
@@ -84,31 +84,62 @@
name = "DS9 Overcoat (use uniform)"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/trek/ds9
+ restricted_desc = "All, barring Service and Civilian"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster",
"Medical Doctor","Chemist","Virologist","Geneticist","Scientist", "Roboticist",
"Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer",
"Cargo Technician", "Shaft Miner") //everyone who actually deserves a job.
//Federation jackets from movies
/datum/gear/trekcmdcap
- name = "fed (movie) uniform, Captain"
+ name = "Fed (movie) uniform, Black"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/fluff/fedcoat/capt
restricted_roles = list("Captain","Head of Personnel")
/datum/gear/trekcmdmov
- name = "fed (movie) uniform, sec"
+ name = "Fed (movie) uniform, Red"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/fluff/fedcoat
+ restricted_desc = "Heads of Staff and Security"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster","Warden","Detective","Security Officer")
/datum/gear/trekmedscimov
- name = "fed (movie) uniform, med/sci"
+ name = "Fed (movie) uniform, Blue"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/fluff/fedcoat/medsci
+ restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengmov
- name = "fed (movie) uniform, ops/eng"
+ name = "Fed (movie) uniform, Yellow"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/fluff/fedcoat/eng
+ restricted_desc = "Engineering and Cargo"
+ restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Cargo Technician", "Shaft Miner", "Quartermaster")
+
+/datum/gear/trekcmdcapmod
+ name = "Fed (Modern) uniform, White"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/storage/fluff/modernfedcoat
+ restricted_roles = list("Captain","Head of Personnel")
+
+/datum/gear/trekcmdmod
+ name = "Fed (Modern) uniform, Red"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/storage/fluff/modernfedcoat/sec
+ restricted_desc = "Heads of Staff and Security"
+ restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster","Warden","Detective","Security Officer")
+
+/datum/gear/trekmedscimod
+ name = "Fed (Modern) uniform, Blue"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/storage/fluff/modernfedcoat/medsci
+ restricted_desc = "Medical and Science"
+ restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
+
+/datum/gear/trekengmod
+ name = "Fed (Modern) uniform, Yellow"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/storage/fluff/modernfedcoat/eng
+ restricted_desc = "Engineering and Cargo"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Cargo Technician", "Shaft Miner", "Quartermaster")
diff --git a/modular_citadel/code/modules/client/loadout/uniform.dm b/modular_citadel/code/modules/client/loadout/uniform.dm
index e4e2f063d3..81e17e95d3 100644
--- a/modular_citadel/code/modules/client/loadout/uniform.dm
+++ b/modular_citadel/code/modules/client/loadout/uniform.dm
@@ -179,18 +179,21 @@
name = "TOS uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command
+ restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscitos
name = "TOS uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci
+ restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengtos
name = "TOS uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec
+ restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
//TNG
@@ -198,18 +201,21 @@
name = "TNG uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command/next
+ restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscitng
name = "TNG uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci/next
+ restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengtng
name = "TNG uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec/next
+ restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
//VOY
@@ -217,18 +223,21 @@
name = "VOY uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command/voy
+ restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscivoy
name = "VOY uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci/voy
+ restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengvoy
name = "VOY uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec/voy
+ restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
//DS9
@@ -236,18 +245,21 @@
name = "DS9 uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command/ds9
+ restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscids9
name = "DS9 uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci/ds9
+ restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengds9
name = "DS9 uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec/ds9
+ restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
//ENT
@@ -255,16 +267,19 @@
name = "ENT uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command/ent
+ restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscient
name = "ENT uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci/ent
+ restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengent
name = "ENT uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec/ent
+ restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
diff --git a/modular_citadel/code/modules/client/preferences.dm b/modular_citadel/code/modules/client/preferences.dm
index 358208c1d7..dfe419964e 100644
--- a/modular_citadel/code/modules/client/preferences.dm
+++ b/modular_citadel/code/modules/client/preferences.dm
@@ -24,77 +24,7 @@
// stuff that was in base
max_save_slots = 10
- features = list("mcolor" = "FFF",
- "tail_lizard" = "Smooth",
- "tail_human" = "None",
- "snout" = "Round",
- "horns" = "None",
- "ears" = "None",
- "wings" = "None",
- "frills" = "None",
- "spines" = "None",
- "body_markings" = "None",
- "legs" = "Normal Legs",
- "moth_wings" = "Plain",
- "mcolor2" = "FFF",
- "mcolor3" = "FFF",
- "mam_body_markings" = "None",
- "mam_ears" = "None",
- "mam_snouts" = "None",
- "mam_tail" = "None",
- "mam_tail_animated" = "None",
- "xenodorsal" = "Standard",
- "xenohead" = "Standard",
- "xenotail" = "Xenomorph Tail",
- "taur" = "None",
- "exhibitionist" = FALSE,
- "genitals_use_skintone" = FALSE,
- "has_cock" = FALSE,
- "cock_shape" = "Human",
- "cock_length" = 6,
- "cock_girth_ratio" = COCK_GIRTH_RATIO_DEF,
- "cock_color" = "fff",
- "has_sheath" = FALSE,
- "sheath_color" = "fff",
- "has_balls" = FALSE,
- "balls_internal" = FALSE,
- "balls_color" = "fff",
- "balls_amount" = 2,
- "balls_sack_size" = BALLS_SACK_SIZE_DEF,
- "balls_size" = BALLS_SIZE_DEF,
- "balls_cum_rate" = CUM_RATE,
- "balls_cum_mult" = CUM_RATE_MULT,
- "balls_efficiency" = CUM_EFFICIENCY,
- "balls_fluid" = "semen",
- "has_ovi" = FALSE,
- "ovi_shape" = "knotted",
- "ovi_length" = 6,
- "ovi_color" = "fff",
- "has_eggsack" = FALSE,
- "eggsack_internal" = TRUE,
- "eggsack_color" = "fff",
- "eggsack_size" = BALLS_SACK_SIZE_DEF,
- "eggsack_egg_color" = "fff",
- "eggsack_egg_size" = EGG_GIRTH_DEF,
- "has_breasts" = FALSE,
- "breasts_color" = "fff",
- "breasts_size" = "C",
- "breasts_shape" = "Pair",
- "breasts_fluid" = "milk",
- "has_vag" = FALSE,
- "vag_shape" = "Human",
- "vag_color" = "fff",
- "vag_clits" = 1,
- "vag_clit_diam" = 0.25,
- "has_womb" = FALSE,
- "womb_cum_rate" = CUM_RATE,
- "womb_cum_mult" = CUM_RATE_MULT,
- "womb_efficiency" = CUM_EFFICIENCY,
- "womb_fluid" = "femcum",
- "ipc_screen" = "Sunburst",
- "ipc_antenna" = "None",
- "flavor_text" = ""
- )
+
/datum/preferences/New(client/C)
..()
diff --git a/modular_citadel/code/modules/clothing/under/trek_under.dm b/modular_citadel/code/modules/clothing/under/trek_under.dm
index ddcf0e6344..8e2b94372d 100644
--- a/modular_citadel/code/modules/clothing/under/trek_under.dm
+++ b/modular_citadel/code/modules/clothing/under/trek_under.dm
@@ -15,7 +15,6 @@
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
item_state = ""
can_adjust = FALSE //to prevent you from "wearing it casually"
- mutantrace_variation = NO_MUTANTRACE_VARIATION
//TOS
/obj/item/clothing/under/rank/trek/command
@@ -117,25 +116,25 @@
/obj/item/clothing/under/rank/trek/command/ds9
desc = "The uniform worn by command officers of the 2380s."
- icon_state = "trek_command"
+ icon_state = "trek_ds9_command"
item_state = "trek_ds9_command"
/obj/item/clothing/under/rank/trek/engsec/ds9
desc = "The uniform worn by operations officers of the 2380s."
- icon_state = "trek_engsec"
+ icon_state = "trek_ds9_engsec"
item_state = "trek_ds9_engsec"
/obj/item/clothing/under/rank/trek/medsci/ds9
desc = "The uniform undershirt worn by medsci officers of the 2380s."
- icon_state = "trek_medsci"
+ icon_state = "trek_ds9_medsci"
item_state = "trek_ds9_medsci"
//MODERN ish Joan sqrl sprites. I think
//For general use
/obj/item/clothing/suit/storage/fluff/fedcoat
- name = "Federation Uniform Jacket (Red)"
- desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. Set phasers to awesome."
+ name = "Federation Uniform Jacket"
+ desc = "A uniform jacket from the United Federation. Set phasers to awesome."
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
@@ -177,27 +176,24 @@
icon_state = "[initial(icon_state)]_open"
item_state = "[initial(item_state)]_open"
unbuttoned = 1
- usr << "You unbutton the coat."
+ to_chat(usr,"You unbutton the coat.")
if(1)
icon_state = "[initial(icon_state)]"
item_state = "[initial(item_state)]"
unbuttoned = 0
- usr << "You button up the coat."
+ to_chat(usr,"You button up the coat.")
usr.update_inv_wear_suit()
//Variants
/obj/item/clothing/suit/storage/fluff/fedcoat/medsci
- desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. Wearing this may make you feel all scientific."
icon_state = "fedblue"
item_state = "fedblue"
/obj/item/clothing/suit/storage/fluff/fedcoat/eng
- desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it.Wearing it may make you feel like checking a warp core, whatever that is."
icon_state = "fedeng"
item_state = "fedeng"
/obj/item/clothing/suit/storage/fluff/fedcoat/capt
- desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. You feel like a commanding officer of Starfleet."
icon_state = "fedcapt"
item_state = "fedcapt"
@@ -205,34 +201,31 @@
/obj/item/clothing/suit/storage/fluff/modernfedcoat
name = "Modern Federation Uniform Jacket"
- desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. Wearing this makes you feel like a competant commander."
+ desc = "A modern uniform jacket from the United Federation."
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
icon_state = "fedmodern"
item_state = "fedmodern"
body_parts_covered = CHEST|GROIN|ARMS
allowed = list(
- /obj/item/tank/internals/emergency_oxygen,
- /obj/item/flashlight,
- /obj/item/gun,
- /obj/item/melee/baton,
- /obj/item/restraints/handcuffs,
- /obj/item/taperecorder)
- armor = list("melee" = 45, "bullet" = 25, "laser" = 25,"energy" = 25, "bomb" = 25, "bio" = 25, "rad" = 50, "fire" = 50, "acid" = 50)
+ /obj/item/flashlight, /obj/item/analyzer,
+ /obj/item/radio, /obj/item/tank/internals/emergency_oxygen,
+ /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/reagent_containers/syringe,
+ /obj/item/reagent_containers/glass/bottle/vial,/obj/item/reagent_containers/glass/beaker,
+ /obj/item/reagent_containers/pill,/obj/item/storage/pill_bottle, /obj/item/restraints/handcuffs,/obj/item/hypospray
+ )
+ armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 5, "rad" = 10, "fire" = 10, "acid" = 0)
//Variants
/obj/item/clothing/suit/storage/fluff/modernfedcoat/medsci
- desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. Wearing this makes you feel like a scientist or a pilot."
icon_state = "fedmodernblue"
item_state = "fedmodernblue"
/obj/item/clothing/suit/storage/fluff/modernfedcoat/eng
- desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. You feel like you can handle any type of technical engineering problems."
icon_state = "fedmoderneng"
item_state = "fedmoderneng"
/obj/item/clothing/suit/storage/fluff/modernfedcoat/sec
- desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. This uniform makes you want to protect and serve as an officer."
icon_state = "fedmodernsec"
item_state = "fedmodernsec"
@@ -256,3 +249,7 @@
/obj/item/clothing/head/caphat/formal/fedcover/sec
icon_state = "fedcapsec"
item_state = "fedcapsec"
+
+/obj/item/clothing/head/caphat/formal/fedcover/black
+ icon_state = "fedcapblack"
+ item_state = "fedcapblack"
diff --git a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm
index 246205f7b6..547c1a5768 100644
--- a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm
+++ b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm
@@ -14,7 +14,6 @@
ext_cooldown = 25
/obj/item/integrated_circuit/manipulation/electric_stimulator/do_work()
- ..()
set_pin_data(IC_OUTPUT, 1, 0)
var/mob/living/M = get_pin_data_as_type(IC_INPUT, 1, /mob/living)
if(!check_target(M))
diff --git a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm
index 1a82040dbc..a4532d0820 100644
--- a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm
+++ b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm
@@ -36,6 +36,24 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+/datum/sprite_accessory/body_markings/guilmon
+ name = "Guilmon"
+ icon_state = "guilmon"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+
+/datum/sprite_accessory/tails/lizard/guilmon
+ name = "Guilmon"
+ icon_state = "guilmon"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+
+/datum/sprite_accessory/tails_animated/lizard/guilmon
+ name = "Guilmon"
+ icon_state = "guilmon"
+ color_src = MATRIXED
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+
//christ this was a mistake, but it's here just in case someone wants to selectively fix
/************* Lizard compatable snoots ***********
/datum/sprite_accessory/snouts/bird
@@ -197,6 +215,12 @@
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
+/datum/sprite_accessory/ears/human/elf
+ name = "Elf"
+ icon_state = "elf"
+ icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+ color_src = SKINTONE
+
/datum/sprite_accessory/ears/fennec
name = "Fennec"
icon_state = "fennec"
@@ -291,7 +315,7 @@
icon_state = "wah"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
-
+
/datum/sprite_accessory/tails/human/axolotl
name = "Axolotl"
icon_state = "axolotl"
@@ -315,7 +339,7 @@
icon_state = "bee"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
-
+
/datum/sprite_accessory/tails/human/cat
name = "Cat"
icon_state = "cat"
@@ -327,7 +351,7 @@
icon_state = "cat"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = HAIR
-
+
/datum/sprite_accessory/tails/human/catbig
name = "Cat, Big"
icon_state = "catbig"
@@ -339,7 +363,7 @@
icon_state = "catbig"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
-
+
/datum/sprite_accessory/tails/human/cow
name = "Cow"
icon_state = "cow"
@@ -359,7 +383,7 @@
/datum/sprite_accessory/tails_animated/human/corvid
name = "Corvid"
icon_state = "crow"
-
+
/datum/sprite_accessory/tails/human/eevee
name = "Eevee"
icon_state = "eevee"
@@ -371,7 +395,7 @@
icon_state = "eevee"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
-
+
/datum/sprite_accessory/tails/human/fennec
name = "Fennec"
icon_state = "fennec"
@@ -383,7 +407,7 @@
icon_state = "fennec"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
-
+
/datum/sprite_accessory/tails/human/fish
name = "Fish"
icon_state = "fish"
@@ -395,7 +419,7 @@
icon_state = "fish"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
-
+
/datum/sprite_accessory/tails/human/fox
name = "Fox"
icon_state = "fox"
@@ -443,7 +467,7 @@
icon_state = "insect"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
-
+
/datum/sprite_accessory/tails/human/kitsune
name = "Kitsune"
icon_state = "kitsune"
@@ -455,7 +479,7 @@
icon_state = "kitsune"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
+
/datum/sprite_accessory/tails/human/murid
name = "Murid"
icon_state = "murid"
@@ -467,7 +491,7 @@
icon_state = "murid"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
+
/datum/sprite_accessory/tails/human/otie
name = "Otusian"
icon_state = "otie"
@@ -491,7 +515,7 @@
icon_state = "orca"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
+
/datum/sprite_accessory/tails/human/pede
name = "Scolipede"
icon_state = "pede"
@@ -503,7 +527,7 @@
icon_state = "pede"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
+
/datum/sprite_accessory/tails/human/rabbit
name = "Rabbit"
icon_state = "rabbit"
@@ -515,7 +539,7 @@
icon_state = "rabbit"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
+
/datum/sprite_accessory/tails/human/sergal
name = "Sergal"
icon_state = "sergal"
@@ -527,7 +551,7 @@
icon_state = "sergal"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
+
/datum/sprite_accessory/tails/human/skunk
name = "skunk"
icon_state = "skunk"
@@ -571,7 +595,7 @@
/datum/sprite_accessory/tails_animated/human/straighttail
name = "Straight Tail"
icon_state = "straighttail"
-
+
/datum/sprite_accessory/tails/human/squirrel
name = "Squirrel"
icon_state = "squirrel"
@@ -595,7 +619,7 @@
icon_state = "tentacle"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
+
/datum/sprite_accessory/tails/human/tiger
name = "Tiger"
icon_state = "tiger"
@@ -607,7 +631,7 @@
icon_state = "tiger"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
+
/datum/sprite_accessory/tails/human/wolf
name = "Wolf"
icon_state = "wolf"
@@ -619,7 +643,7 @@
icon_state = "wolf"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
+
/******************************************
*********** Mammal Body Parts *************
*******************************************/
@@ -1281,26 +1305,31 @@ datum/sprite_accessory/mam_tails/insect
name = "None"
icon_state = "none"
ckeys_allowed = list("yousshouldnteverbeseeingthisyoumeme")
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/plain
name = "Plain"
icon_state = "plain"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
-/datum/sprite_accessory/mam_body_markings/ailurus
+/datum/sprite_accessory/mam_body_markings/redpanda
name = "Redpanda"
- icon_state = "wah"
+ icon_state = "redpanda"
/datum/sprite_accessory/mam_body_markings/bee
name = "Bee"
icon_state = "bee"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/belly
name = "Belly"
icon_state = "belly"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/bellyslim
name = "Bellyslim"
icon_state = "bellyslim"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/corgi
name = "Corgi"
@@ -1345,6 +1374,7 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/frog
name = "Frog"
icon_state = "frog"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/goat
name = "Goat"
@@ -1353,6 +1383,7 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/handsfeet
name = "Handsfeet"
icon_state = "handsfeet"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/hawk
name = "Hawk"
@@ -1373,6 +1404,7 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/moth
name = "Moth"
icon_state = "moth"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/otie
name = "Otie"
@@ -1401,6 +1433,7 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/pede
name = "Scolipede"
icon_state = "scolipede"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/shark
name = "Shark"
@@ -1429,6 +1462,7 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/turian
name = "Turian"
icon_state = "turian"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/wolf
name = "Wolf"
@@ -1437,6 +1471,7 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/xeno
name = "Xeno"
icon_state = "xeno"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/******************************************
@@ -1746,19 +1781,6 @@ datum/sprite_accessory/mam_tails/insect
// *** Snooooow flaaaaake ***
-/datum/sprite_accessory/body_markings/guilmon
- name = "Guilmon"
- icon_state = "guilmon"
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails/lizard/guilmon
- name = "Guilmon"
- icon_state = "guilmon"
-
-/datum/sprite_accessory/tails_animated/lizard/guilmon
- name = "Guilmon"
- icon_state = "guilmon"
-
/datum/sprite_accessory/horns/guilmon
name = "Guilmon"
icon_state = "guilmon"
@@ -1788,6 +1810,7 @@ datum/sprite_accessory/mam_tails/insect
name = "sabresune"
icon_state = "sabresune"
ckeys_allowed = list("poojawa")
+ extra = TRUE
/datum/sprite_accessory/mam_tails/sabresune
name = "sabresune"
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index 64898f0121..b4eec5786a 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -14,7 +14,7 @@
default_features = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_body_markings" = "Plain", "mam_snouts" = "None", "taur" = "None")
say_mod = "says"
hair_color = "mutcolor"
- hair_alpha = 180
+ hair_alpha = 160 //a notch brighter so it blends better.
liked_food = MEAT
coldmod = 3
heatmod = 1
diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm
index 90dd577c4b..8af0dc2013 100644
--- a/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm
+++ b/modular_citadel/code/modules/projectiles/guns/ballistic/magweapon_energy.dm
@@ -74,10 +74,12 @@
/obj/item/stock_parts/cell/magrifle_e
name = "magrifle power supply"
maxcharge = 14400
+ chargerate = 3520
/obj/item/stock_parts/cell/magpistol_e
name = "magpistol power supply"
maxcharge = 6000
+ chargerate = 1000
///sci designs///
@@ -171,6 +173,12 @@
var/cell_type = /obj/item/stock_parts/cell/magrifle_e
var/dead_cell = FALSE
+/obj/item/gun/ballistic/automatic/magrifle_e/examine(mob/user)
+ . = ..()
+ if(cell)
+ to_chat(user, "[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full.")
+ else
+ to_chat(user, "[src] doesn't seem to have a cell!")
/obj/item/gun/ballistic/automatic/magrifle_e/can_shoot()
if(QDELETED(cell))
@@ -229,6 +237,13 @@
var/cell_type = /obj/item/stock_parts/cell/magpistol_e
var/dead_cell = FALSE
+/obj/item/gun/ballistic/automatic/pistol/mag_e/examine(mob/user)
+ . = ..()
+ if(cell)
+ to_chat(user, "[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full.")
+ else
+ to_chat(user, "[src] doesn't seem to have a cell!")
+
/obj/item/gun/ballistic/automatic/pistol/mag_e/can_shoot()
if(QDELETED(cell))
return 0
diff --git a/modular_citadel/icons/mob/clothing/trek_item_icon.dmi b/modular_citadel/icons/mob/clothing/trek_item_icon.dmi
index 86afe16b03..ed3286615b 100644
Binary files a/modular_citadel/icons/mob/clothing/trek_item_icon.dmi and b/modular_citadel/icons/mob/clothing/trek_item_icon.dmi differ
diff --git a/modular_citadel/icons/mob/clothing/trek_mob_icon.dmi b/modular_citadel/icons/mob/clothing/trek_mob_icon.dmi
index 51daa8179f..d3ebc31b6a 100644
Binary files a/modular_citadel/icons/mob/clothing/trek_mob_icon.dmi and b/modular_citadel/icons/mob/clothing/trek_mob_icon.dmi differ
diff --git a/modular_citadel/icons/mob/mam_ears.dmi b/modular_citadel/icons/mob/mam_ears.dmi
index b3946b546c..f2a788d900 100644
Binary files a/modular_citadel/icons/mob/mam_ears.dmi and b/modular_citadel/icons/mob/mam_ears.dmi differ
diff --git a/modular_citadel/icons/mob/mam_markings.dmi b/modular_citadel/icons/mob/mam_markings.dmi
index c391674190..ceecf12d2e 100644
Binary files a/modular_citadel/icons/mob/mam_markings.dmi and b/modular_citadel/icons/mob/mam_markings.dmi differ
diff --git a/modular_citadel/icons/mob/mam_tails.dmi b/modular_citadel/icons/mob/mam_tails.dmi
index 74eccae2f8..b16de1c0de 100644
Binary files a/modular_citadel/icons/mob/mam_tails.dmi and b/modular_citadel/icons/mob/mam_tails.dmi differ
diff --git a/modular_citadel/icons/mob/markings_notmammals.dmi b/modular_citadel/icons/mob/markings_notmammals.dmi
index 4161ea2cea..316d1d1af8 100644
Binary files a/modular_citadel/icons/mob/markings_notmammals.dmi and b/modular_citadel/icons/mob/markings_notmammals.dmi differ
diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi
index 6a0bf77cd3..1ed73d2709 100644
Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and b/modular_citadel/icons/mob/mutant_bodyparts.dmi differ
diff --git a/modular_citadel/icons/mob/muzzled_helmet.dmi b/modular_citadel/icons/mob/muzzled_helmet.dmi
index 36313cce66..e1284679b3 100644
Binary files a/modular_citadel/icons/mob/muzzled_helmet.dmi and b/modular_citadel/icons/mob/muzzled_helmet.dmi differ
diff --git a/modular_citadel/icons/mob/suit_digi.dmi b/modular_citadel/icons/mob/suit_digi.dmi
index 22fddbe59d..c19fb01161 100644
Binary files a/modular_citadel/icons/mob/suit_digi.dmi and b/modular_citadel/icons/mob/suit_digi.dmi differ
diff --git a/modular_citadel/icons/mob/uniform_digi.dmi b/modular_citadel/icons/mob/uniform_digi.dmi
index c5ee6b1780..9513f82c9c 100644
Binary files a/modular_citadel/icons/mob/uniform_digi.dmi and b/modular_citadel/icons/mob/uniform_digi.dmi differ
diff --git a/strings/clockwork_cult_changelog.txt b/strings/clockwork_cult_changelog.txt
index c963ca91d1..3c5e5f5ef6 100644
--- a/strings/clockwork_cult_changelog.txt
+++ b/strings/clockwork_cult_changelog.txt
@@ -1 +1,4 @@
-Stargazers have been removed. Integration cogs are now the primary way of creating power.
\ No newline at end of file
+Stargazers have been removed. Integration cogs are now the primary way of creating power.
+Brass Skewers now deal damage to mechs.
+Mech Sensors are now available. They're similar to pressure sensors, but trigger if a mech steps on them, and can be built the same way.
+Power nullifiers are now available. Upon triggering, they send out a small 3x3 EMP, affecting cultists and enemies alike.
diff --git a/strings/tips.txt b/strings/tips.txt
index 9571527853..e9c1350469 100644
--- a/strings/tips.txt
+++ b/strings/tips.txt
@@ -229,6 +229,8 @@ As a Servant, wraith spectacles let you see everything through walls at virtuall
As a Servant, declaring war empowers a huge amount of your tools and constructs, and makes you into a spaceproof, armored clockwork automaton.
As a Servant, converting or sabotaging Science and Genetics can make defending the Ark much easier.
As a Servant, the Clockwork Armaments scripture allows you to summon armor and/or a weapon at will. Use it whenever you unlock it!
+As a Servant, Brass created from your replica fabricators can be ground down in reagent grinders for teslium and iron.
+You can bypass Servant created pressure sensors if you walk instead of jog on them. Alternatively, you can also become a Servant of Ratvar.
You can deconvert Cultists of Nar-Sie and Servants of Ratvar by feeding them large amounts of holy water. Unlike revolutionaries, implanting them with mindshield implants won't do it!
Tiles sprayed with holy water will permanently block Servants of Ratvar from teleporting onto them.
As a Wizard, you can turn people to stone, then animate the resulting statue with a staff of animation to create an extremely powerful minion, for all of 5 minutes at least.
diff --git a/strings/traumas.json b/strings/traumas.json
index 9394f11f3a..f83a023491 100644
--- a/strings/traumas.json
+++ b/strings/traumas.json
@@ -108,7 +108,31 @@
"@pick(semicolon)i ran into the supermattre ten i dsappeard @pick(bug)",
"DON'T EVER TUCH ME",
"@pick(semicolon)GIVE ME FREE ROBUX PLEASE JUST ENOUGH FOR SHIRT AND PANTS",
- "@pick(semicolon) DOOR STUCK!!"
+ "@pick(semicolon) DOOR STUCK!!",
+ "HOW DO i VORE",
+ "HOW DO i HAV SEX",
+ "@pick(semicolon)how do u cum",
+ "@pick(semicolon)ahelp how do u use dildo",
+ ";AI LAW 3 OPEN THIS.",
+ "ahelp hos pwrgamre they have 24 inch dick",
+ ";KERPTAN IS A KERNDUM",
+ "@pick(semicolon)RESEARCH NANITES FIRST",
+ "@pick(semicolon)how use comms?????????",
+ "@pick(semicolon)im SICK of ths fuckign humans runin g my furry server",
+ "@pick(semicolon)ai ROUGE",
+ "ahelp want a big titty @pick(create_nouns) gf to deepthroat my pp",
+ "@pick(semicolon)CHEMISST MAKE HEXACROCON OR REPORT",
+ "@pick(semicolon)drone 765 law 2 state LAWS NOW",
+ "@pick(semicolon)SM ROGUE",
+ "@pick(semicolon)IPCS STATE LAWS NOW",
+ "@pick(semicolon)lING DORMS i hear Suking noises!!!",
+ "@pick(semicolon)@pick(roles) tator they have @pick(mutations)!!",
+ "@pick(semicolon)aooc how do i steel @pick(cargo)?",
+ "@pick(semicolon)how do i play",
+ "ahelp help security powergaming with mindshields???",
+ ";,g absorbing @pick(roles)",
+ ";chemist can u @pick(create_verbs) holy @pick(mellens) for @pick(s_roles)???!!",
+ "@pick(semicolon) LIZZARRD SPEAKIGN IN EVIL BULL LANGUAGE SCI!!"
],
"mutations": [
diff --git a/tgstation.dme b/tgstation.dme
index 9e9c6fe593..12a91dfaa9 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1236,8 +1236,10 @@
#include "code\modules\antagonists\clockcult\clock_structures\wall_gear.dm"
#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\lever.dm"
#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\pressure_sensor.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\pressure_sensor_mech.dm"
#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\repeater.dm"
#include "code\modules\antagonists\clockcult\clock_structures\traps\brass_skewer.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\traps\power_null.dm"
#include "code\modules\antagonists\clockcult\clock_structures\traps\steam_vent.dm"
#include "code\modules\antagonists\cult\blood_magic.dm"
#include "code\modules\antagonists\cult\cult.dm"
@@ -1753,6 +1755,7 @@
#include "code\modules\integrated_electronics\subtypes\text.dm"
#include "code\modules\integrated_electronics\subtypes\time.dm"
#include "code\modules\integrated_electronics\subtypes\trig.dm"
+#include "code\modules\integrated_electronics\subtypes\weaponized.dm"
#include "code\modules\jobs\access.dm"
#include "code\modules\jobs\job_exp.dm"
#include "code\modules\jobs\jobs.dm"