diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm
index 072f5b8f40d..14d93439510 100644
--- a/code/game/gamemodes/changeling/powers/tiny_prick.dm
+++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm
@@ -94,7 +94,7 @@
/datum/action/changeling/sting/transformation/can_sting(mob/user, mob/target)
if(!..())
return
- if(HAS_TRAIT(target, TRAIT_HUSK) || (!ishuman(target)))
+ if(HAS_TRAIT(target, TRAIT_HUSK) || !ishuman(target) || (NOTRANSSTING in target.dna.species.species_traits))
to_chat(user, "Our sting appears ineffective against its DNA.")
return FALSE
if(ishuman(target))
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index a1f214fa4a1..fa0ba2fbf0f 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -14,7 +14,8 @@ GLOBAL_VAR(bomb_set)
icon_state = "nuclearbomb0"
density = 1
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
- var/extended = FALSE
+ anchored = TRUE
+ var/extended = TRUE
var/lighthack = FALSE
var/timeleft = 120
var/timing = FALSE
@@ -34,6 +35,10 @@ GLOBAL_VAR(bomb_set)
/obj/machinery/nuclearbomb/syndicate
is_syndicate = TRUE
+/obj/machinery/nuclearbomb/undeployed
+ extended = FALSE
+ anchored = FALSE
+
/obj/machinery/nuclearbomb/New()
..()
r_code = rand(10000, 99999.0) // Creates a random code upon object spawn.
@@ -269,11 +274,6 @@ GLOBAL_VAR(bomb_set)
else
code = "ERROR"
return
-
- if(!yes_code) // All requests below here require both NAD inserted AND code correct
- return
-
- switch(action)
if("toggle_anchor")
if(removal_stage == NUKE_MOBILE)
anchored = FALSE
@@ -288,6 +288,11 @@ GLOBAL_VAR(bomb_set)
else
visible_message("The anchoring bolts slide back into the depths of [src].")
return
+
+ if(!yes_code) // All requests below here require both NAD inserted AND code correct
+ return
+
+ switch(action)
if("set_time")
var/time = input(usr, "Detonation time (seconds, min 120, max 600)", "Input Time", 120) as num|null
if(time)
diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm
index 7d2f0e404f5..8a3628a1717 100644
--- a/code/game/gamemodes/vampire/vampire.dm
+++ b/code/game/gamemodes/vampire/vampire.dm
@@ -220,6 +220,10 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
/obj/effect/proc_holder/spell/vampire/targetted/enthrall = 300,
/datum/vampire_passive/full = 500)
+/datum/vampire/proc/adjust_nullification(base, extra)
+ // First hit should give full nullification, while subsequent hits increase the value slower
+ nullified = max(nullified + extra, base)
+
/datum/vampire/New(gend = FEMALE)
gender = gend
diff --git a/code/game/objects/items/tools/multitool.dm b/code/game/objects/items/tools/multitool.dm
index bad1a325b26..7acee5352a3 100644
--- a/code/game/objects/items/tools/multitool.dm
+++ b/code/game/objects/items/tools/multitool.dm
@@ -12,7 +12,7 @@
icon = 'icons/obj/device.dmi'
icon_state = "multitool"
flags = CONDUCT
- force = 5.0
+ force = 0
w_class = WEIGHT_CLASS_SMALL
throwforce = 0
throw_range = 7
diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm
index 59880fdcc8c..a9cfbbbe36b 100644
--- a/code/game/objects/items/weapons/holy_weapons.dm
+++ b/code/game/objects/items/weapons/holy_weapons.dm
@@ -39,7 +39,7 @@
if(ishuman(M) && M.mind?.vampire)
if(!M.mind.vampire.get_ability(/datum/vampire_passive/full))
to_chat(M, "The nullrod's power interferes with your own!")
- M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
+ M.mind.vampire.adjust_nullification(5, 2)
/obj/item/nullrod/pickup(mob/living/user)
. = ..()
@@ -476,7 +476,7 @@
return
if(target.mind.vampire && !target.mind.vampire.get_ability(/datum/vampire_passive/full)) // Getting a full prayer off on a vampire will interrupt their powers for a large duration.
- target.mind.vampire.nullified = max(120, target.mind.vampire.nullified + 120)
+ target.mind.vampire.adjust_nullification(120, 50)
to_chat(target, "[user]'s prayer to [SSticker.Bible_deity_name] has interfered with your power!")
praying = FALSE
return
@@ -500,7 +500,7 @@
if(holder.l_hand == src || holder.r_hand == src) // Holding this in your hand will
for(var/mob/living/carbon/human/H in range(5, loc))
if(H.mind && H.mind.vampire && !H.mind.vampire.get_ability(/datum/vampire_passive/full))
- H.mind.vampire.nullified = max(5, H.mind.vampire.nullified + 2)
+ H.mind.vampire.adjust_nullification(5, 2)
if(prob(10))
to_chat(H, "Being in the presence of [holder]'s [src] is interfering with your powers!")
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index a1d84912f3f..c34e17943cb 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -263,6 +263,7 @@
icon_state = "meson"
item_state = "meson"
resistance_flags = NONE
+ prescription_upgradable = TRUE
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
sprite_sheets = list(
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 7126f8513f7..9baf6c46079 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -618,7 +618,9 @@ BLIND // can't see anything
resistance_flags = NONE
hide_tail_by_species = null
species_restricted = list("exclude","Wryn")
-
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
//Under clothing
/obj/item/clothing/under
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 68539c0822f..d07b95d18eb 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -4,31 +4,33 @@
// Pre-upgraded upgradable glasses
name = "prescription [name]"
-/obj/item/clothing/glasses/attackby(obj/item/O as obj, mob/user as mob)
- if(user.stat || user.restrained() || !ishuman(user))
+/obj/item/clothing/glasses/attackby(obj/item/I, mob/user)
+ if(!prescription_upgradable || user.stat || user.restrained() || !ishuman(user))
return ..()
var/mob/living/carbon/human/H = user
- if(prescription_upgradable)
- if(istype(O, /obj/item/clothing/glasses/regular))
- if(prescription)
- to_chat(H, "You can't possibly imagine how adding more lenses would improve \the [name].")
- return
- H.unEquip(O)
- O.loc = src // Store the glasses for later removal
- to_chat(H, "You fit \the [name] with lenses from \the [O].")
- prescription = 1
- name = "prescription [name]"
+
+ // Adding prescription glasses
+ if(istype(I, /obj/item/clothing/glasses/regular))
+ if(prescription)
+ to_chat(H, "You can't possibly imagine how adding more lenses would improve [src].")
return
- if(prescription && istype(O, /obj/item/screwdriver))
- var/obj/item/clothing/glasses/regular/G = locate() in src
- if(!G)
- G = new(get_turf(H))
- to_chat(H, "You salvage the prescription lenses from \the [name].")
- prescription = 0
- name = initial(name)
- H.put_in_hands(G)
- return
- return ..()
+ H.unEquip(I)
+ I.loc = src // Store the glasses for later removal
+ to_chat(H, "You fit [src] with lenses from [I].")
+ prescription = TRUE
+ name = "prescription [initial(name)]"
+
+ // Removing prescription glasses
+ else if(prescription && istype(I, /obj/item/screwdriver))
+ var/obj/item/clothing/glasses/regular/G = locate() in src
+ if(!G)
+ G = new(src)
+ to_chat(H, "You salvage the prescription lenses from [src].")
+ prescription = FALSE
+ name = initial(name)
+ H.put_in_hands(G)
+
+ H.update_nearsighted_effects()
/obj/item/clothing/glasses/visor_toggling()
..()
@@ -114,7 +116,7 @@
icon_state = "purple"
item_state = "glasses"
origin_tech = "magnets=2;engineering=1"
- prescription_upgradable = 0
+ prescription_upgradable = TRUE
scan_reagents = 1 //You can see reagents while wearing science goggles
resistance_flags = ACID_PROOF
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
@@ -135,6 +137,7 @@
icon_state = "nvpurple"
item_state = "glasses"
see_in_dark = 8
+ prescription_upgradable = FALSE
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE //don't render darkness while wearing these
/obj/item/clothing/glasses/janitor
@@ -454,6 +457,7 @@
vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS
see_in_dark = 8
scan_reagents = 1
+ prescription = TRUE
flags = NODROP
flags_cover = null
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm
index b644e5ad2b9..b69c8256c0b 100644
--- a/code/modules/reagents/chemistry/reagents/toxins.dm
+++ b/code/modules/reagents/chemistry/reagents/toxins.dm
@@ -203,6 +203,7 @@
reagent_state = LIQUID
color = "#7DFF00"
taste_description = "slime"
+ can_synth = FALSE
/datum/reagent/stable_mutagen/on_new(data)
..()
diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm
index cb69f3b7b31..c51972b99c6 100644
--- a/code/modules/reagents/chemistry/reagents/water.dm
+++ b/code/modules/reagents/chemistry/reagents/water.dm
@@ -284,7 +284,7 @@
update_flags |= M.adjustStaminaLoss(5, FALSE)
if(prob(20))
M.emote("scream")
- M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
+ M.mind.vampire.adjust_nullification(5, 2)
M.mind.vampire.bloodusable = max(M.mind.vampire.bloodusable - 3,0)
if(M.mind.vampire.bloodusable)
V.vomit(0,1)
@@ -296,7 +296,7 @@
switch(current_cycle)
if(1 to 4)
to_chat(M, "Something sizzles in your veins!")
- M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
+ M.mind.vampire.adjust_nullification(5, 2)
if(5 to 12)
to_chat(M, "You feel an intense burning inside of you!")
update_flags |= M.adjustFireLoss(1, FALSE)
@@ -304,7 +304,7 @@
M.Jitter(20)
if(prob(20))
M.emote("scream")
- M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
+ M.mind.vampire.adjust_nullification(5, 2)
if(13 to INFINITY)
to_chat(M, "You suddenly ignite in a holy fire!")
for(var/mob/O in viewers(M, null))
@@ -316,7 +316,7 @@
M.Jitter(30)
if(prob(40))
M.emote("scream")
- M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
+ M.mind.vampire.adjust_nullification(5, 2)
return ..() | update_flags
@@ -333,7 +333,7 @@
return
else
to_chat(M, "Something holy interferes with your powers!")
- M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
+ M.mind.vampire.adjust_nullification(5, 2)
/datum/reagent/holywater/reaction_turf(turf/simulated/T, volume)
diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm
index 001d8d2f7c6..cf61f2f916b 100644
--- a/code/modules/reagents/chemistry/recipes/toxins.dm
+++ b/code/modules/reagents/chemistry/recipes/toxins.dm
@@ -154,19 +154,6 @@
result_amount = 3
mix_message = "The substance turns neon green and bubbles unnervingly."
-/datum/chemical_reaction/stable_mutagen
- name = "Stable mutagen"
- id = "stable_mutagen"
- result = "stable_mutagen"
- required_reagents = list("mutagen" = 1, "lithium" = 1, "acetone" = 1, "bromine" = 1)
- result_amount = 3
- mix_message = "The substance turns a drab green and begins to bubble."
-
-/datum/chemical_reaction/stable_mutagen/stable_mutagen2
- id = "stable_mutagen2"
- required_reagents = list("mutadone" = 3, "lithium" = 1)
- result_amount = 4
-
/datum/chemical_reaction/rotatium
name = "Rotatium"
id = "Rotatium"
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 2676e31a7ae..cb93b21e0b0 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index b3d8fd6ce4f..e6ec527f9d4 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/species/vox/helmet.dmi b/icons/mob/species/vox/helmet.dmi
index 52d31674635..968de6b8de8 100644
Binary files a/icons/mob/species/vox/helmet.dmi and b/icons/mob/species/vox/helmet.dmi differ
diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi
index 5fd53d8d5c6..6dee942eabb 100644
Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ
diff --git a/tgui/packages/tgui/interfaces/NuclearBomb.js b/tgui/packages/tgui/interfaces/NuclearBomb.js
index e3d7b1cc949..209fad1cbf3 100644
--- a/tgui/packages/tgui/interfaces/NuclearBomb.js
+++ b/tgui/packages/tgui/interfaces/NuclearBomb.js
@@ -49,7 +49,7 @@ export const NuclearBomb = (props, context) => {