diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index 61bc32d378e..aaf98516fa8 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -43,6 +43,7 @@
#define RADIMMUNE 2048
#define ALL_RPARTS 4096
#define NOGUNS 8192
+#define NOTRANSSTING 16384
//Species clothing flags
#define HAS_UNDERWEAR 1
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 2793198681c..c25802d38fc 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -9,7 +9,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
config_tag = "changeling"
restricted_jobs = list("AI", "Cyborg")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer")
- protected_species = list("Machine", "Slime People", "Plasmaman")
+ protected_species = list("Machine")
required_players = 15
required_enemies = 1
recommended_enemies = 4
@@ -228,9 +228,9 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/dna_max = 5 //How many total DNA strands the changeling can store for transformation.
var/absorbedcount = 1 //Would require at least 1 sample to take on the form of a human
var/chem_charges = 20
- var/chem_recharge_rate = 0.5
+ var/chem_recharge_rate = 1
var/chem_recharge_slowdown = 0
- var/chem_storage = 50
+ var/chem_storage = 75
var/sting_range = 2
var/changelingID = "Changeling"
var/geneticdamage = 0
@@ -314,18 +314,10 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
to_chat(user, "This creature does not have DNA!")
return
- if(T.species.flags & NO_SCAN)
- to_chat(user, "We do not know how to parse this creature's DNA!")
- return
-
- if(T.species.flags & NO_BLOOD)
- to_chat(user, "We are not able to use the DNA of a creature without a circulatory system.")
- return
-
if(has_dna(target.dna))
to_chat(user, "We already have this DNA in storage!")
return 1
/proc/check_species_absorb(datum/species/S)
- return !((S.flags & NO_DNA) || (S.flags & NO_SCAN) || (S.flags & NO_BLOOD))
+ return !(S.flags & NO_DNA)
diff --git a/code/game/gamemodes/changeling/powers/glands.dm b/code/game/gamemodes/changeling/powers/glands.dm
deleted file mode 100644
index d08bd3021aa..00000000000
--- a/code/game/gamemodes/changeling/powers/glands.dm
+++ /dev/null
@@ -1,13 +0,0 @@
-/obj/effect/proc_holder/changeling/glands
- name = "Engorged Chemical Glands"
- desc = "Our chemical glands swell, permitting us to store more chemicals inside of them."
- helptext = "Allows us to store an extra 25 units of chemicals, and doubles production rate."
- dna_cost = 2
- chemical_cost = -1
-
-/obj/effect/proc_holder/changeling/glands/on_purchase(var/mob/user)
- ..()
- var/datum/changeling/changeling=user.mind.changeling
- changeling.chem_storage += 25
- changeling.chem_recharge_rate *=2
- return
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/lesserform.dm b/code/game/gamemodes/changeling/powers/lesserform.dm
index ea22ba5800a..e5040af282f 100644
--- a/code/game/gamemodes/changeling/powers/lesserform.dm
+++ b/code/game/gamemodes/changeling/powers/lesserform.dm
@@ -18,7 +18,7 @@
var/mob/living/carbon/human/H = user
if(!istype(H) || !H.species.primitive_form)
- to_chat(src, "We cannot perform this ability in this form!")
+ to_chat(H, "We cannot perform this ability in this form!")
return
H.visible_message("[H] transforms!")
diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm
index fd5d71e9453..4219032fb96 100644
--- a/code/game/gamemodes/changeling/powers/mutations.dm
+++ b/code/game/gamemodes/changeling/powers/mutations.dm
@@ -159,18 +159,20 @@
if(!A.requiresID() || A.allowed(user)) //This is to prevent stupid shit like hitting a door with an arm blade, the door opening because you have acces and still getting a "the airlocks motors resist our efforts to force it" message.
return
- if(A.arePowerSystemsOn())
- to_chat(user, "The airlock's motors resist our efforts to force it.")
- return
-
- else if(A.locked)
+ if(A.locked)
to_chat(user, "The airlock's bolts prevent it from being forced.")
return
- else
- //user.say("Heeeeeeeeeerrre's Johnny!")
- user.visible_message("[user] forces the door to open with \his [src]!", "We force the door to open.", "You hear a metal screeching sound.")
- A.open(1)
+ if(A.arePowerSystemsOn())
+ user.visible_message("[user] jams [src] into the airlock and starts prying it open!", "We start forcing the airlock open.", \
+ "You hear a metal screeching sound.")
+ playsound(A, 'sound/machines/airlock_alien_prying.ogg', 150, 1)
+ if(!do_after(user, 150, target = A))
+ return
+
+ //user.say("Heeeeeeeeeerrre's Johnny!")
+ user.visible_message("[user] forces the airlock to open with \his [src]!", "We force the airlock to open.", "You hear a metal screeching sound.")
+ A.open(2)
/***************************************\
diff --git a/code/game/gamemodes/changeling/powers/swap_form.dm b/code/game/gamemodes/changeling/powers/swap_form.dm
index ce8bda64d03..82baf6d5293 100644
--- a/code/game/gamemodes/changeling/powers/swap_form.dm
+++ b/code/game/gamemodes/changeling/powers/swap_form.dm
@@ -17,7 +17,7 @@
if((NOCLONE || SKELETON || HUSK) in target.mutations)
to_chat(user, "DNA of [target] is ruined beyond usability!")
return
- if(!istype(target) || issmall(target) || target.species.flags & NO_DNA || target.species.flags & NO_SCAN || target.species.flags & NO_BLOOD)
+ if(!istype(target) || issmall(target) || target.species.flags & NO_DNA)
to_chat(user, "[target] is not compatible with this ability.")
return
return 1
@@ -28,7 +28,7 @@
var/mob/living/carbon/human/target = G.affecting
var/datum/changeling/changeling = user.mind.changeling
- to_chat(user, "We tighen our grip. We must hold still....")
+ to_chat(user, "We tighten our grip. We must hold still....")
target.do_jitter_animation(500)
user.do_jitter_animation(500)
diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm
index 0df371009a8..648d8ac1cbb 100644
--- a/code/game/gamemodes/changeling/powers/tiny_prick.dm
+++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm
@@ -27,7 +27,7 @@
/mob/living/carbon/proc/unset_sting()
if(mind && mind.changeling && mind.changeling.chosen_sting)
- src.mind.changeling.chosen_sting.unset_sting(src)
+ mind.changeling.chosen_sting.unset_sting(src)
/obj/effect/proc_holder/changeling/sting/can_sting(var/mob/user, var/mob/target)
if(!..())
@@ -66,8 +66,8 @@
desc = "We silently sting a human, injecting a retrovirus that forces them to transform."
helptext = "The victim will transform much like a changeling would. The effects will be obvious to the victim, and the process will damage our genomes."
sting_icon = "sting_transform"
- chemical_cost = 40
- dna_cost = 2
+ chemical_cost = 50
+ dna_cost = 3
genetic_damage = 100
var/datum/dna/selected_dna = null
@@ -80,6 +80,10 @@
selected_dna = changeling.select_dna("Select the target DNA: ", "Target DNA")
if(!selected_dna)
return
+ var/datum/species/newspecies = all_species[selected_dna.species]
+ if((newspecies.flags & NOTRANSSTING) || newspecies.is_small)
+ to_chat(user, "The selected DNA is incompatible with our sting.")
+ return
..()
/obj/effect/proc_holder/changeling/sting/transformation/can_sting(var/mob/user, var/mob/target)
@@ -87,19 +91,13 @@
return
if((HUSK in target.mutations) || (!ishuman(target)))
to_chat(user, "Our sting appears ineffective against its DNA.")
- return 0
+ return FALSE
if(ishuman(target))
var/mob/living/carbon/human/H = target
- if(H.species.flags & NO_SCAN) //Prevents transforming slimes and killing them instantly
- to_chat(user, "This won't work on a creature with abnormal genetic material.")
- return 0
- if(H.species.flags & NO_BLOOD)
- to_chat(user, "This won't work on a creature without a circulatory system.")
- return 0
if(H.species.flags & NO_DNA)
to_chat(user, "This won't work on a creature without DNA.")
- return 0
- return 1
+ return FALSE
+ return TRUE
/obj/effect/proc_holder/changeling/sting/transformation/sting_action(var/mob/user, var/mob/target)
add_logs(user, target, "stung", object="transformation sting", addition=" new identity is [selected_dna.real_name]")
@@ -122,7 +120,7 @@
target.UpdateAppearance()
domutcheck(target, null)
feedback_add_details("changeling_powers","TS")
- return 1
+ return TRUE
obj/effect/proc_holder/changeling/sting/extract_dna
name = "Extract DNA Sting"
diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm
index 7ef4f0bc7b4..fbb7506f121 100644
--- a/code/game/gamemodes/changeling/traitor_chan.dm
+++ b/code/game/gamemodes/changeling/traitor_chan.dm
@@ -6,7 +6,7 @@
required_players = 10
required_enemies = 1 // how many of each type are required
recommended_enemies = 3
- var/protected_species_changeling = list("Machine", "Slime People")
+ var/protected_species_changeling = list("Machine")
/datum/game_mode/traitor/changeling/announce()
to_chat(world, "The current game mode is - Traitor+Changeling!")
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index fd6f07960e1..1ec91da1130 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -295,11 +295,11 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) \
var/target_real_name // Has to be stored because the target's real_name can change over the course of the round
/datum/objective/escape/escape_with_identity/find_target()
- var/list/possible_targets = list() //Copypasta because NO_SCAN races, yay for snowflakes.
+ var/list/possible_targets = list() //Copypasta because NO_DNA races, yay for snowflakes.
for(var/datum/mind/possible_target in ticker.minds)
if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && possible_target.current.client)
var/mob/living/carbon/human/H = possible_target.current
- if(!(H.species.flags & NO_SCAN))
+ if(!(H.species.flags & NO_DNA))
possible_targets += possible_target
if(possible_targets.len > 0)
target = pick(possible_targets)
@@ -455,12 +455,12 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) \
if(ticker.current_state == GAME_STATE_SETTING_UP)
for(var/mob/new_player/P in player_list)
if(P.client && P.ready && P.mind != owner)
- if(P.client.prefs && (P.client.prefs.species == "Vox" || P.client.prefs.species == "Slime People" || P.client.prefs.species == "Machine")) // Special check for species that can't be absorbed. No better solution.
+ if(P.client.prefs && (P.client.prefs.species == "Machine")) // Special check for species that can't be absorbed. No better solution.
continue
n_p++
else if(ticker.current_state == GAME_STATE_PLAYING)
for(var/mob/living/carbon/human/P in player_list)
- if(P.species.flags & NO_SCAN)
+ if(P.species.flags & NO_DNA)
continue
if(P.client && !(P.mind in ticker.mode.changelings) && P.mind!=owner)
n_p++
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index 5fe7d44ab6d..1a79374407c 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -6,7 +6,7 @@
//language = "Clatter"
unarmed_type = /datum/unarmed_attack/punch
- flags = IS_WHITELISTED | NO_BLOOD
+ flags = IS_WHITELISTED | NO_BLOOD | NOTRANSSTING
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
index 0a9067ea5d4..32e246254b6 100644
--- a/code/modules/mob/living/carbon/human/species/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -282,7 +282,7 @@
breath_type = "nitrogen"
poison_type = "oxygen"
- flags = NO_SCAN | IS_WHITELISTED
+ flags = NO_SCAN | IS_WHITELISTED | NOTRANSSTING
clothing_flags = HAS_SOCKS
dietflags = DIET_OMNI
bodyflags = HAS_ICON_SKIN_TONE | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_BODY_MARKINGS | HAS_TAIL_MARKINGS
@@ -852,7 +852,7 @@
burn_mod = 2.5 // So they take 50% extra damage from brute/burn overall.
death_message = "gives one shrill beep before falling limp, their monitor flashing blue before completely shutting off..."
- flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | NO_POISON | RADIMMUNE | ALL_RPARTS
+ flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | NO_POISON | RADIMMUNE | ALL_RPARTS | NOTRANSSTING
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY
dietflags = 0 //IPCs can't eat, so no diet
diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi
index 1957a0aa1e0..54d39e581db 100644
Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ
diff --git a/paradise.dme b/paradise.dme
index cdaf2b9c9fd..8d0b4576bf8 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -393,7 +393,6 @@
#include "code\game\gamemodes\changeling\powers\epinephrine.dm"
#include "code\game\gamemodes\changeling\powers\fakedeath.dm"
#include "code\game\gamemodes\changeling\powers\fleshmend.dm"
-#include "code\game\gamemodes\changeling\powers\glands.dm"
#include "code\game\gamemodes\changeling\powers\headcrab.dm"
#include "code\game\gamemodes\changeling\powers\hivemind.dm"
#include "code\game\gamemodes\changeling\powers\humanform.dm"
diff --git a/sound/machines/airlock_alien_prying.ogg b/sound/machines/airlock_alien_prying.ogg
new file mode 100644
index 00000000000..470e86eb259
Binary files /dev/null and b/sound/machines/airlock_alien_prying.ogg differ