diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index 6d1a05defc..e728d49956 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -149,9 +149,9 @@
//OPEN TURF ATMOS
#define OPENTURF_DEFAULT_ATMOS "o2=22;n2=82;TEMP=293.15" //the default air mix that open turfs spawn
-#define TCOMMS_ATMOS "n2=100;TEMP=80" //-193,15°C telecommunications. also used for xenobiology slime killrooms
+#define TCOMMS_ATMOS "n2=100;TEMP=80" //-193,15degC telecommunications. also used for xenobiology slime killrooms
#define AIRLESS_ATMOS "TEMP=2.7" //space
-#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" //-93.15°C snow and ice turfs
+#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" //-93.15degC snow and ice turfs
#define BURNMIX_ATMOS "o2=2500;plasma=5000;TEMP=370" //used in the holodeck burn test program
//ATMOSPHERICS DEPARTMENT GAS TANK TURFS
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index b7b25f0b5a..9083783a48 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -312,23 +312,26 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
attack_verb = list("stubbed", "poked")
resistance_flags = FIRE_PROOF
var/extended = 0
+ var/extended_force = 20
+ var/extended_throwforce = 23
+ var/extended_icon_state = "switchblade_ext"
/obj/item/switchblade/attack_self(mob/user)
extended = !extended
playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, 1)
if(extended)
- force = 20
+ force = extended_force
w_class = WEIGHT_CLASS_NORMAL
- throwforce = 23
- icon_state = "switchblade_ext"
+ throwforce = extended_throwforce
+ icon_state = extended_icon_state
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP
else
- force = 3
+ force = initial(force)
w_class = WEIGHT_CLASS_SMALL
- throwforce = 5
- icon_state = "switchblade"
+ throwforce = initial(throwforce)
+ icon_state = initial(icon_state)
attack_verb = list("stubbed", "poked")
hitsound = 'sound/weapons/genhit.ogg'
sharpness = IS_BLUNT
@@ -337,6 +340,23 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
user.visible_message("[user] is slitting [user.p_their()] own throat with [src]! It looks like [user.p_theyre()] trying to commit suicide!")
return (BRUTELOSS)
+/obj/item/switchblade/crafted
+ icon_state = "switchblade_ms"
+ desc = "A concealable spring-loaded knife."
+ force = 2
+ throwforce = 3
+ extended_force = 15
+ extended_throwforce = 18
+ extended_icon_state = "switchblade_ext_ms"
+
+/obj/item/switchblade/crafted/attackby(obj/item/I, mob/user, params)
+ . = ..()
+ if(istype(I, /obj/item/stack/sheet/mineral/silver))
+ icon_state = extended ? "switchblade_ext_msf" : "switchblade_msf"
+ extended_icon_state = "switchblade_ext_msf"
+ icon_state = "switchblade_msf"
+ to_chat(user, "You use part of the silver to improve your Switchblade. Stylish!")
+
/obj/item/phone
name = "red phone"
desc = "Should anything ever go wrong..."
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 75daaabb99..a69b0c10b8 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -479,22 +479,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
be_random_body = sanitize_integer(be_random_body, 0, 1, initial(be_random_body))
- if(gender == MALE)
- hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_male_list)
- facial_hair_style = sanitize_inlist(facial_hair_style, GLOB.facial_hair_styles_male_list)
- undershirt = sanitize_inlist(undershirt, GLOB.undershirt_m)
- underwear = sanitize_inlist(underwear, GLOB.underwear_m)
- else if(gender == FEMALE)
- hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_female_list)
- facial_hair_style = sanitize_inlist(facial_hair_style, GLOB.facial_hair_styles_female_list)
- undershirt = sanitize_inlist(undershirt, GLOB.undershirt_f)
- underwear = sanitize_inlist(underwear, GLOB.underwear_f)
- else
- hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_list)
- facial_hair_style = sanitize_inlist(facial_hair_style, GLOB.facial_hair_styles_list)
- underwear = sanitize_inlist(underwear, GLOB.underwear_list)
- undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list)
-
+ hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_list)
+ facial_hair_style = sanitize_inlist(facial_hair_style, GLOB.facial_hair_styles_list)
+ underwear = sanitize_inlist(underwear, GLOB.underwear_list)
+ undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list)
undie_color = sanitize_hexcolor(undie_color, 3, FALSE, initial(undie_color))
shirt_color = sanitize_hexcolor(shirt_color, 3, FALSE, initial(shirt_color))
socks = sanitize_inlist(socks, GLOB.socks_list)
diff --git a/code/modules/crafting/recipes/recipes_weapon_and_ammo.dm b/code/modules/crafting/recipes/recipes_weapon_and_ammo.dm
index bc3a3dcf05..a519f00fe9 100644
--- a/code/modules/crafting/recipes/recipes_weapon_and_ammo.dm
+++ b/code/modules/crafting/recipes/recipes_weapon_and_ammo.dm
@@ -109,6 +109,18 @@
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
+/datum/crafting_recipe/switchblade_ms
+ name = "Switchblade"
+ result = /obj/item/switchblade/crafted
+ reqs = list(/obj/item/weaponcrafting/stock = 1,
+ /obj/item/weaponcrafting/receiver = 1,
+ /obj/item/kitchen/knife = 1,
+ /obj/item/stack/cable_coil = 2)
+ tools = list(TOOL_WELDER)
+ time = 45
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
+
//////////////////
///BOMB CRAFTING//
//////////////////
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index aba640c550..c3548ff8ae 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -200,25 +200,25 @@
message_param = "blows a kiss to %t."
emote_type = EMOTE_AUDIBLE
-/datum/emote/living/laugh
+/datum/emote/living/audio_emote
+ emote_type = EMOTE_AUDIBLE
+
+/datum/emote/living/audio_emote/can_run_emote(mob/living/user, status_check = TRUE)
+ . = ..()
+ if(. && iscarbon(user))
+ var/mob/living/carbon/C = user
+ return !C.silent && (!C.mind || !C.mind.miming)
+
+/datum/emote/living/audio_emote/laugh
key = "laugh"
key_third_person = "laughs"
message = "laughs."
message_mime = "laughs silently!"
- emote_type = EMOTE_AUDIBLE
-/datum/emote/living/laugh/can_run_emote(mob/living/user, status_check = TRUE)
- . = ..()
- if(. && iscarbon(user))
- var/mob/living/carbon/C = user
- return !C.silent
-
-/datum/emote/living/laugh/run_emote(mob/user, params)
+/datum/emote/living/audio_emote/laugh/run_emote(mob/user, params)
. = ..()
if(. && iscarbon(user)) //Citadel Edit because this is hilarious
var/mob/living/carbon/C = user
- if(!C.mind || C.mind.miming)
- return
if(iscatperson(C)) //we ask for is cat first because they're a subtype that tests true for ishumanbasic because HERESY
playsound(C, pick('sound/voice/catpeople/nyahaha1.ogg',
'sound/voice/catpeople/nyahaha2.ogg',
@@ -226,12 +226,27 @@
'sound/voice/catpeople/nyahehe.ogg'),
50, 1)
return
- if(ishumanbasic(C))
+ else if(ismoth(C))
+ playsound(C, 'sound/voice/moth/mothlaugh.ogg', 50, 1)
+ else if(ishumanbasic(C))
if(user.gender == FEMALE)
playsound(C, 'sound/voice/human/womanlaugh.ogg', 50, 1)
else
playsound(C, pick('sound/voice/human/manlaugh1.ogg', 'sound/voice/human/manlaugh2.ogg'), 50, 1)
+/datum/emote/living/audio_emote/chitter
+ key = "chitter"
+ key_third_person = "chitters"
+ message = "chitters."
+ message_mime = "chitters silently!"
+
+/datum/emote/living/audio_emote/chitter/run_emote(mob/user, params)
+ . = ..()
+ if(. && iscarbon(user)) //Citadel Edit because this is hilarious
+ var/mob/living/carbon/C = user
+ if(ismoth(C))
+ playsound(C, 'sound/voice/moth/mothchitter.ogg', 50, 1)
+
/datum/emote/living/look
key = "look"
key_third_person = "looks"
diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm
index b1d7ab7166..af9e23ab70 100644
--- a/code/modules/projectiles/guns/energy/dueling.dm
+++ b/code/modules/projectiles/guns/energy/dueling.dm
@@ -22,6 +22,11 @@
var/list/fired = list()
var/countdown_length = 10
var/countdown_step = 0
+ var/static/next_id = 1
+ var/id
+
+/datum/duel/New()
+ id = next_id++
/datum/duel/proc/try_begin()
//Check if both guns are held and if so begin.
@@ -157,6 +162,13 @@
setting_overlay = mutable_appearance(icon,setting_iconstate())
add_overlay(setting_overlay)
+/obj/item/gun/energy/dueling/examine(mob/user)
+ . = ..()
+ if(duel)
+ . += "Its linking number is [duel.id]."
+ else
+ . += "ERROR: No linking number on gun."
+
/obj/item/gun/energy/dueling/proc/setting_iconstate()
switch(setting)
if(DUEL_SETTING_A)
@@ -370,6 +382,8 @@
/obj/item/storage/lockbox/dueling/hugbox
gun_type = /obj/item/gun/energy/dueling/hugbox
+ req_access = list(ACCESS_ARMORY)
/obj/item/storage/lockbox/dueling/hugbox/stamina
gun_type = /obj/item/gun/energy/dueling/hugbox/stamina
+ req_access = null
diff --git a/html/changelogs/AutoChangeLog-pr-10644.yml b/html/changelogs/AutoChangeLog-pr-10644.yml
new file mode 100644
index 0000000000..b7544495d7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10644.yml
@@ -0,0 +1,4 @@
+author: "ShadeAware"
+delete-after: True
+changes:
+ - rscadd: "Craftable Switchblades, a weaker subtype of normal switchblades that can be crafted using a Kitchen Knife, Modular Receiver, Rifle Stock and some Cable Coil. Requires a welder to complete."
diff --git a/html/changelogs/AutoChangeLog-pr-10768.yml b/html/changelogs/AutoChangeLog-pr-10768.yml
new file mode 100644
index 0000000000..0a07505b5b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10768.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - rscadd: "moths now have unique laughs and can *chitter."
diff --git a/html/changelogs/AutoChangeLog-pr-10782.yml b/html/changelogs/AutoChangeLog-pr-10782.yml
new file mode 100644
index 0000000000..f66e75a113
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10782.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - tweak: "dueling pistol accesses have been changed to be more accessible."
diff --git a/html/changelogs/AutoChangeLog-pr-10790.yml b/html/changelogs/AutoChangeLog-pr-10790.yml
new file mode 100644
index 0000000000..43f949ce16
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10790.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Hair styles and undergarments are yet again free from gender restrictions."
diff --git a/html/changelogs/AutoChangeLog-pr-10795.yml b/html/changelogs/AutoChangeLog-pr-10795.yml
new file mode 100644
index 0000000000..b929aad0a5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10795.yml
@@ -0,0 +1,4 @@
+author: "ShadeAware"
+delete-after: True
+changes:
+ - bugfix: "You can now actually craft Switchblades."
diff --git a/html/changelogs/AutoChangeLog-pr-10809.yml b/html/changelogs/AutoChangeLog-pr-10809.yml
new file mode 100644
index 0000000000..2a6c1dcdb8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10809.yml
@@ -0,0 +1,4 @@
+author: "Arturlang"
+delete-after: True
+changes:
+ - bugfix: "Fancifying makeshift switchblades now works"
diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi
index 2169b87580..b74fa16e6a 100644
Binary files a/icons/mob/inhands/weapons/swords_lefthand.dmi and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi
index f054d8f744..8c60c52e76 100644
Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index e3540a782b..561b1890e8 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/sound/voice/moth/mothchitter.ogg b/sound/voice/moth/mothchitter.ogg
new file mode 100644
index 0000000000..842bcf8e53
Binary files /dev/null and b/sound/voice/moth/mothchitter.ogg differ
diff --git a/sound/voice/moth/mothlaugh.ogg b/sound/voice/moth/mothlaugh.ogg
new file mode 100644
index 0000000000..391d6c5aef
Binary files /dev/null and b/sound/voice/moth/mothlaugh.ogg differ