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