From ee2fee1371b7c690f84c7220fa8718091559c710 Mon Sep 17 00:00:00 2001 From: alex-gh Date: Sun, 23 Mar 2014 23:36:19 +0100 Subject: [PATCH 01/13] Killing blob spores can now infect you with the blob --- code/modules/reagents/Chemistry-Reagents.dm | 24 +++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 81466069dd1..003969cdb7f 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -2016,6 +2016,30 @@ datum if( (prob(10) && method==TOUCH) || method==INGEST) M.contract_disease(new /datum/disease/xeno_transformation(0),1) + spore + name = "Blob Spores" + id = "spore" + description = "Spores of some blob creature thingy." + reagent_state = LIQUID + color = "#CE760A" // rgb: 206, 118, 10 + var/client/blob_client = null + var/blob_point_rate = 3 + + on_mob_life(var/mob/living/M) + if(!M) M = holder.my_atom + if (prob(1) && prob(50)) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(directory[ckey(C.key)]) + blob_client = directory[ckey(C.key)] + C.gib() + if(blob_client) + var/obj/effect/blob/core/core = new(get_turf(C), 200, blob_client, blob_point_rate) + if(core.overmind && core.overmind.mind) + core.overmind.mind.name = C.name + + return + //foam precursor fluorosurfactant From 5268aeda407d0617f298c2f93dd624c7244ce7ed Mon Sep 17 00:00:00 2001 From: alex-gh Date: Mon, 24 Mar 2014 00:00:20 +0100 Subject: [PATCH 02/13] Disabled smoothwall for now. --- code/game/smoothwall.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/smoothwall.dm b/code/game/smoothwall.dm index a6a42109559..b06598a3ee8 100644 --- a/code/game/smoothwall.dm +++ b/code/game/smoothwall.dm @@ -102,7 +102,8 @@ /turf/simulated/wall/Destroy() - var/temploc = src.loc +//This proc performs really badly with qdel relativewall gets called a over ten thousand times. Commenting it out until I get to figure out what exactly goes wrong here. uc +/* var/temploc = src.loc spawn(10) for(var/turf/simulated/wall/W in range(temploc,1)) @@ -110,7 +111,7 @@ for(var/obj/structure/falsewall/W in range(temploc,1)) W.relativewall() - +*/ for(var/direction in cardinal) for(var/obj/effect/glowshroom/shroom in get_step(src,direction)) if(!shroom.floor) //shrooms drop to the floor From 4fa7522ada0e2883ce0985c6b7dbfb862b7bd1b5 Mon Sep 17 00:00:00 2001 From: alex-gh Date: Mon, 24 Mar 2014 00:15:18 +0100 Subject: [PATCH 03/13] Replaced the brig objective with debrain objective --- code/game/gamemodes/traitor/traitor.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 6ddb95d5e95..e1cca78c59d 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -102,10 +102,10 @@ kill_objective.find_target() traitor.objectives += kill_objective if(34 to 50) - var/datum/objective/brig/brig_objective = new - brig_objective.owner = traitor - brig_objective.find_target() - traitor.objectives += brig_objective + var/datum/objective/debrain/debrain_objective = new + debrain_objective.owner = traitor + debrain_objective.find_target() + traitor.objectives += debrain_objective if(51 to 66) var/datum/objective/harm/harm_objective = new harm_objective.owner = traitor From fd65367f414046e7e766046c43f99702564d74ac Mon Sep 17 00:00:00 2001 From: alex-gh Date: Mon, 24 Mar 2014 00:40:58 +0100 Subject: [PATCH 04/13] Added an objective to protect other traitors --- code/game/gamemodes/traitor/traitor.dm | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index e1cca78c59d..1aace19e5e7 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -96,16 +96,23 @@ else switch(rand(1,100)) - if(1 to 33) + if(1 to 25) var/datum/objective/assassinate/kill_objective = new kill_objective.owner = traitor kill_objective.find_target() traitor.objectives += kill_objective - if(34 to 50) + if(26 to 40) var/datum/objective/debrain/debrain_objective = new debrain_objective.owner = traitor debrain_objective.find_target() traitor.objectives += debrain_objective + if(41 to 50) + var/datum/objective/protect/protect_objective = new + protect_objective.owner = traitor + protect_objective.find_target_by_role("Traitor",0) //Protect your fellow traitor + if (!protect_objective.target) + protect_objective.find_target() //We could not find any traitors, protect somebody + traitor.objectives += protect_objective if(51 to 66) var/datum/objective/harm/harm_objective = new harm_objective.owner = traitor From 1482e1cd912c5db2cc3d0a25ca847c403bd82e22 Mon Sep 17 00:00:00 2001 From: alex-gh Date: Mon, 24 Mar 2014 00:44:35 +0100 Subject: [PATCH 05/13] Removed the steal coin objective: We have no mint and no money bags --- code/game/gamemodes/objective.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 9b596da3028..e265cf3bf77 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -5,7 +5,8 @@ var/list/potential_theft_objectives=typesof(/datum/theft_objective) \ - /datum/theft_objective \ - /datum/theft_objective/special \ - /datum/theft_objective/number \ - - /datum/theft_objective/number/special + - /datum/theft_objective/number/special \ + - /datum/theft_objective/number/coins datum/objective var/datum/mind/owner = null //Who owns the objective. @@ -266,7 +267,6 @@ datum/objective/protect//The opposite of killing a dude. explanation_text = "Free Objective" return target - find_target_by_role(role, role_type=0) ..(role, role_type) if(target && target.current) From be2932fd87117ddbd04287fa60c09829cd287807 Mon Sep 17 00:00:00 2001 From: Mloc-Argent Date: Sat, 15 Mar 2014 18:02:24 +0000 Subject: [PATCH 06/13] Fixes #4589 Signed-off-by: Mloc-Argent --- code/game/machinery/doors/windowdoor.dm | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index ba457e2685d..1d78e8b21b8 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -131,11 +131,12 @@ var/obj/item/weapon/airlock_electronics/ae if(!electronics) ae = new/obj/item/weapon/airlock_electronics( src.loc ) - if(src.req_access.len) - ae.conf_access = src.req_access - else if (src.req_one_access.len) - ae.conf_access = src.req_one_access - ae.one_access = 1 + if(src.req_access) + if(src.req_access.len) + ae.conf_access = src.req_access + else if (src.req_one_access.len) + ae.conf_access = src.req_one_access + ae.one_access = 1 else ae = electronics electronics = null From 5a1a9cb14dc8b58057e4bc84ab6f777c7e995a8f Mon Sep 17 00:00:00 2001 From: Segrain Date: Sat, 15 Mar 2014 23:02:57 +0300 Subject: [PATCH 07/13] Fix for #4589. Conflicts: code/game/machinery/doors/airlock.dm --- code/game/machinery/doors/airlock.dm | 3 ++- code/game/machinery/doors/windowdoor.dm | 18 ++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index d22c77771e3..27f5560fa03 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -966,6 +966,8 @@ About the new airlock wires panel: var/obj/item/weapon/airlock_electronics/ae if(!electronics) ae = new/obj/item/weapon/airlock_electronics( src.loc ) + if(!src.req_access) + src.check_access() if(src.req_access.len) ae.conf_access = src.req_access else if (src.req_one_access.len) @@ -1162,4 +1164,3 @@ About the new airlock wires panel: return else return - diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 1d78e8b21b8..145cafa4e71 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -131,12 +131,13 @@ var/obj/item/weapon/airlock_electronics/ae if(!electronics) ae = new/obj/item/weapon/airlock_electronics( src.loc ) - if(src.req_access) - if(src.req_access.len) - ae.conf_access = src.req_access - else if (src.req_one_access.len) - ae.conf_access = src.req_one_access - ae.one_access = 1 + if(!src.req_access) + src.check_access() + if(src.req_access.len) + ae.conf_access = src.req_access + else if (src.req_one_access.len) + ae.conf_access = src.req_one_access + ae.one_access = 1 else ae = electronics electronics = null @@ -231,6 +232,8 @@ var/obj/item/weapon/airlock_electronics/ae if(!electronics) ae = new/obj/item/weapon/airlock_electronics( src.loc ) + if(!src.req_access) + src.check_access() if(src.req_access.len) ae.conf_access = src.req_access else if (src.req_one_access.len) @@ -346,5 +349,4 @@ /obj/machinery/door/window/brigdoor/southright dir = SOUTH icon_state = "rightsecure" - base_state = "rightsecure" - + base_state = "rightsecure" From ec1439823152b8ae7e86bbfe1ba16790770a53fa Mon Sep 17 00:00:00 2001 From: alex-gh Date: Mon, 24 Mar 2014 01:17:15 +0100 Subject: [PATCH 08/13] Blob announcement changes. --- code/game/gamemodes/blob/blob.dm | 4 ++-- code/game/gamemodes/blob/blob_report.dm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 6b6db7d0768..5abacbeae6a 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -175,10 +175,10 @@ var/list/blob_nodes = list() return if (1) - command_alert("Confirmed outbreak of level 7 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert") + command_alert("NanoTrasen has issued a directive 7-10 for [station_name()]. The station is to be considered quarantined.", "Biohazard Alert") for(var/mob/M in player_list) if(!istype(M,/mob/new_player)) - M << sound('sound/AI/outbreak7.ogg') + M << sound('sound/AI/blob_confirmed.ogg') return if (2) diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm index 36c6f458544..4f32d870afe 100644 --- a/code/game/gamemodes/blob/blob_report.dm +++ b/code/game/gamemodes/blob/blob_report.dm @@ -32,7 +32,7 @@ intercepttext += "Message ends." for (var/mob/living/silicon/ai/aiPlayer in player_list) if (aiPlayer.client) - var/law = "The station is under quarantine, prevent biological entities from leaving the station at all costs while minimizing collateral damage. The nuclear failsafe must be activated at any cost, the code is: [get_nuke_code()]." + var/law = "The station is under quarantine, prevent biological entities from leaving the station at all costs. The nuclear failsafe must be activated at any cost, the code is: [get_nuke_code()]." aiPlayer.set_zeroth_law(law) aiPlayer << "\red You have detected a change in your laws information:" aiPlayer << "Laws Updated: [law]" From b7eb15b120522c22d2e8672ce99d844218a856c6 Mon Sep 17 00:00:00 2001 From: alex-gh Date: Mon, 24 Mar 2014 01:25:43 +0100 Subject: [PATCH 09/13] Hostile mobs will now destroy windoors --- code/game/machinery/doors/windowdoor.dm | 10 +++++++++- .../mob/living/simple_animal/hostile/hostile.dm | 4 +++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 145cafa4e71..18be44f4e3e 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -189,6 +189,14 @@ /obj/machinery/door/window/attack_hand(mob/user as mob) return src.attackby(user, user) +/obj/machinery/door/window/attack_animal(mob/user as mob) + if(!isanimal(user)) return + var/mob/living/simple_animal/M = user + if(M.melee_damage_upper <= 0) return + playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) + visible_message("\red [user] smashes against the [src.name].", 1) + take_damage(M.melee_damage_upper) + /obj/machinery/door/window/attackby(obj/item/weapon/I as obj, mob/user as mob) //If it's in the process of opening/closing, ignore the click @@ -349,4 +357,4 @@ /obj/machinery/door/window/brigdoor/southright dir = SOUTH icon_state = "rightsecure" - base_state = "rightsecure" + base_state = "rightsecure" diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index b70a3e27976..65e5d853153 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -271,6 +271,8 @@ for(var/atom/A in T) if(!A.Adjacent(src)) continue - if(istype(A, /obj/structure/window) || istype(A, /obj/structure/closet) || istype(A, /obj/structure/table) || istype(A, /obj/structure/grille) || istype(A, /obj/structure/rack)) + if(istype(A, /obj/structure/window) || istype(A, /obj/structure/closet) || \ + istype(A, /obj/structure/table) || istype(A, /obj/structure/grille) || \ + istype(A, /obj/structure/rack) || istype(A, /obj/machinery/door/window)) A.attack_animal(src) return From f0c7296b5da5e099837d64ffecaf1305f2751dac Mon Sep 17 00:00:00 2001 From: alex-gh Date: Mon, 24 Mar 2014 02:46:47 +0100 Subject: [PATCH 10/13] Blob balance tweaks. Blob will now eat items placed on it. Blob does not produce light anymore (take that dionas) Shield blobs now have same brute resist as normal blobs Attempted to lower the CPU load of the "Pulse" proc. --- code/game/gamemodes/blob/blobs/shield.dm | 2 +- code/game/gamemodes/blob/theblob.dm | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm index 835c6c001e8..c0b1d2aa550 100644 --- a/code/game/gamemodes/blob/blobs/shield.dm +++ b/code/game/gamemodes/blob/blobs/shield.dm @@ -4,7 +4,7 @@ icon_state = "blob_idle" desc = "Some blob creature thingy" health = 60 - brute_resist = 1 + brute_resist = 4 fire_resist = 2 diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 222a510f53f..9fdcc7ce7ba 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -2,7 +2,7 @@ /obj/effect/blob name = "blob" icon = 'icons/mob/blob.dmi' - luminosity = 3 + luminosity = 0 desc = "Some blob creature thingy" density = 0 opacity = 0 @@ -47,6 +47,8 @@ update_icon() proc/Life() + for(var/atom/A in src.loc)//Hit everything in the turf + A.blob_act() return @@ -57,7 +59,7 @@ if(run_action())//If we can do something here then we dont need to pulse more return - if(pulse > 30) + if(pulse > 20) return//Inf loop check //Looking for another blob to pulse From 66829f8eb666b3193938733d79647e389b70fe15 Mon Sep 17 00:00:00 2001 From: alex-gh Date: Mon, 24 Mar 2014 04:36:20 +0100 Subject: [PATCH 11/13] Tweaked random event chances --- code/modules/events/event_dynamic.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/events/event_dynamic.dm b/code/modules/events/event_dynamic.dm index f97b6527cd1..b8ba1e2de79 100644 --- a/code/modules/events/event_dynamic.dm +++ b/code/modules/events/event_dynamic.dm @@ -44,9 +44,9 @@ var/global/list/possibleEvents = list() //see: // Code/WorkInProgress/Cael_Aislinn/Economy/Economy_Events.dm // Code/WorkInProgress/Cael_Aislinn/Economy/Economy_Events_Mundane.dm - possibleEvents[/datum/event/economic_event] = 200 - possibleEvents[/datum/event/trivial_news] = 300 - possibleEvents[/datum/event/mundane_news] = 200 + possibleEvents[/datum/event/economic_event] = 150 + possibleEvents[/datum/event/trivial_news] = 200 + possibleEvents[/datum/event/mundane_news] = 150 possibleEvents[/datum/event/mass_hallucination] = 200 possibleEvents[/datum/event/falsealarm] = 300 @@ -88,7 +88,7 @@ var/global/list/possibleEvents = list() possibleEvents[/datum/event/anomaly/anomaly_bluespace] = 50 + 25 * active_with_role["Engineer"] possibleEvents[/datum/event/anomaly/anomaly_flux] = 50 + 50 * active_with_role["Engineer"] - possibleEvents[/datum/event/viral_infection] = 25 + active_with_role["Medical"] * 100 + possibleEvents[/datum/event/viral_infection] = 25 + active_with_role["Medical"] * 50 if(active_with_role["Medical"] > 0) possibleEvents[/datum/event/radiation_storm] = active_with_role["Medical"] * 50 possibleEvents[/datum/event/spontaneous_appendicitis] = active_with_role["Medical"] * 150 From 3132b7f2771715b85d51ce79c046984b7b26e77f Mon Sep 17 00:00:00 2001 From: alex-gh Date: Mon, 24 Mar 2014 08:54:40 +0100 Subject: [PATCH 12/13] Added speciesist objective --- code/datums/mind.dm | 9 ++++++-- code/game/gamemodes/objective.dm | 30 ++++++++++++++++++++++++++ code/game/gamemodes/traitor/traitor.dm | 9 ++++---- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index bc81913a56e..88fade901ab 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -414,7 +414,7 @@ datum/mind if(!def_value)//If it's a custom objective, it will be an empty string. def_value = "custom" - var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "blood", "debrain", "protect", "prevent", "harm", "brig", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "custom") + var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "blood", "debrain", "protect", "prevent", "harm", "speciesist", "brig", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "custom") if (!new_obj_type) return var/datum/objective/new_objective = null @@ -452,6 +452,11 @@ datum/mind //Will display as special role if the target is set as MODE. Ninjas/commandos/nuke ops. new_objective.explanation_text = "[objective_type] [new_target:real_name], the [new_target:mind:assigned_role=="MODE" ? (new_target:mind:special_role) : (new_target:mind:assigned_role)]." + if ("speciesist") + new_objective = new /datum/objective/speciesist + new_objective.owner = src + new_objective.find_target() + if ("prevent") new_objective = new /datum/objective/block new_objective.owner = src @@ -581,7 +586,7 @@ datum/mind log_admin("[key_name_admin(usr)] has de-traitor'ed [current].") else if (href_list["revolution"]) - current.hud_updateflag |= (1 << SPECIALROLE_HUD) + current.hud_updateflag |= (1 << SPECIALROLE_HUD) switch(href_list["revolution"]) if("clear") diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index e265cf3bf77..6409063e5f7 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -305,6 +305,36 @@ datum/objective/hijack return 0 return 1 +datum/objective/speciesist + var/datum/species/speciesist_target = null + + find_target() + var/list/possible_targets = list() + var/mob/living/carbon/human/O = owner.current + for(var/datum/mind/possible_target in ticker.minds) + if(ishuman(possible_target.current)) + var/mob/living/carbon/human/M = possible_target.current + if (M.species != O.species) + possible_targets += M.species + if(possible_targets.len > 0) + speciesist_target = pick(possible_targets) + explanation_text = "Do not allow any [speciesist_target.name]s to escape on the shuttle." + else + explanation_text = "Free Objective" + return speciesist_target + + check_completion() + if(emergency_shuttle.location<2) + return 0 + var/area/shuttle = locate(/area/shuttle/escape/centcom) + for(var/mob/living/carbon/human/player in player_list) + if (player.mind) + if (player.species == speciesist_target) + if(player.stat != DEAD) //they're not dead! + if(get_turf(player) in shuttle) + return 0 + return 1 + datum/objective/block explanation_text = "Do not allow any organic lifeforms to escape on the shuttle alive." diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 1aace19e5e7..24198d4e776 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -158,10 +158,11 @@ hijack_objective.owner = traitor traitor.objectives += hijack_objective else // Honk - if (!(locate(/datum/objective/minimize_casualties) in traitor.objectives)) - var/datum/objective/minimize_casualties/escape_objective = new - escape_objective.owner = traitor - traitor.objectives += escape_objective + if (!(locate(/datum/objective/speciesist) in traitor.objectives)) + var/datum/objective/speciesist/speciesist_objective = new + speciesist_objective.owner = traitor + speciesist_objective.find_target() + traitor.objectives += speciesist_objective return From 2b5dbab3b23c0b902527b792f00dd657f0e26d26 Mon Sep 17 00:00:00 2001 From: alex-gh Date: Mon, 24 Mar 2014 12:08:20 +0100 Subject: [PATCH 13/13] Blob spore infection is now curable, added indication for blob infection --- code/modules/reagents/Chemistry-Reagents.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 003969cdb7f..8801b6dcf58 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -2027,7 +2027,11 @@ datum on_mob_life(var/mob/living/M) if(!M) M = holder.my_atom - if (prob(1) && prob(50)) + if (holder.has_reagent("plantbgone",45)) + holder.del_reagent("spore") + if (prob(1)) + M << "\red Your mouth tastes funny." + if (prob(1) && prob(25)) if(iscarbon(M)) var/mob/living/carbon/C = M if(directory[ckey(C.key)])