From a90888b85181ba74dab9145093864d3fc0889736 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 8 Nov 2013 02:10:20 +0400 Subject: [PATCH 01/38] Missed last debug line --- code/WorkInProgress/Cib/MedicalSideEffects.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/WorkInProgress/Cib/MedicalSideEffects.dm b/code/WorkInProgress/Cib/MedicalSideEffects.dm index c11f62a78ef..2d0b8b6ba82 100644 --- a/code/WorkInProgress/Cib/MedicalSideEffects.dm +++ b/code/WorkInProgress/Cib/MedicalSideEffects.dm @@ -64,7 +64,7 @@ // Only do anything if the effect is currently strong enough if(strength_percent >= 0.4) - log_debug ("[src], tick [life_tick] : Active phase ; strength [M.strength]") +// log_debug ("[src], tick [life_tick] : Active phase ; strength [M.strength]") if (M.cure(src) || M.strength > 50) // log_debug ("[src], tick [life_tick] : [M] cured or reached end of lifecycle") side_effects -= M From 8b89b542330bf07904f1148340b757a7017abbb8 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 8 Nov 2013 03:18:25 +0400 Subject: [PATCH 02/38] Caches side effect types to a global list, less loops on addition. Makes them process only every 15 ticks, to cut down on the calls. Removes damage because it was supposed to be gone, no idea why I didn't delete the lines. --- code/WorkInProgress/Cib/MedicalSideEffects.dm | 32 +++++++++---------- code/__HELPERS/global_lists.dm | 8 +++++ 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/code/WorkInProgress/Cib/MedicalSideEffects.dm b/code/WorkInProgress/Cib/MedicalSideEffects.dm index 2d0b8b6ba82..15580c4bd2e 100644 --- a/code/WorkInProgress/Cib/MedicalSideEffects.dm +++ b/code/WorkInProgress/Cib/MedicalSideEffects.dm @@ -23,7 +23,8 @@ /datum/medical_effect/proc/cure(mob/living/carbon/human/H) for(var/R in cures) if(H.reagents.has_reagent(R)) - H <<"\red [cure_message]" + if (cure_message) + H <<"\blue [cure_message]" return 1 return 0 @@ -39,16 +40,21 @@ M.start = life_tick return - var/list/L = typesof(/datum/medical_effect)-/datum/medical_effect - for(var/T in L) - var/datum/medical_effect/M = new T - if(M.name == name) - M.strength = strength - M.start = life_tick - side_effects += M + var/T = side_effects[name] + if (!T) + return + + var/datum/medical_effect/M = new T + if(M.name == name) + M.strength = strength + M.start = life_tick + side_effects += M /mob/living/carbon/human/proc/handle_medical_side_effects() + //Going to handle those things only every few ticks. + if(life_tick % 15 != 0) + return 0 var/list/L = typesof(/datum/medical_effect)-/datum/medical_effect for(var/T in L) @@ -60,18 +66,14 @@ for (var/datum/medical_effect/M in side_effects) if (!M) continue var/strength_percent = sin((life_tick - M.start) / 2) -// log_debug ("[src], tick [life_tick] : Processing [M], Current phase: [strength_percent]") // Only do anything if the effect is currently strong enough if(strength_percent >= 0.4) -// log_debug ("[src], tick [life_tick] : Active phase ; strength [M.strength]") if (M.cure(src) || M.strength > 50) -// log_debug ("[src], tick [life_tick] : [M] cured or reached end of lifecycle") side_effects -= M - del(M) + M = null else if(life_tick % 45 == 0) -// log_debug ("[src], tick [life_tick] : Activating [M] ") M.on_life(src, strength_percent*M.strength) // Effect slowly growing stronger M.strength+=0.08 @@ -92,7 +94,6 @@ H.custom_pain("You feel a throbbing pain in your head!",1) if(31 to INFINITY) H.custom_pain("You feel an excrutiating pain in your head!",1) - H.adjustBrainLoss(1) // BAD STOMACH // =========== @@ -110,7 +111,6 @@ H.custom_pain("Your stomach hurts.",0) if(31 to INFINITY) H.custom_pain("You feel sick.",1) - H.adjustToxLoss(1) // CRAMPS // ====== @@ -129,7 +129,6 @@ if(31 to INFINITY) H.emote("me",1,"flinches as all the muscles in their body cramp up.") H.custom_pain("There's pain all over your body.",1) - H.adjustToxLoss(1) // ITCH // ==== @@ -148,4 +147,3 @@ if(31 to INFINITY) H.emote("me",1,"shivers slightly.") H.custom_pain("This itch makes it really hard to concentrate.",1) - H.adjustToxLoss(1) \ No newline at end of file diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 956e6be2557..9625d9c716a 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -15,6 +15,7 @@ var/global/list/chemical_reactions_list //list of all /datum/chemical_reactio var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff var/global/list/landmarks_list = list() //list of all landmarks created var/global/list/surgery_steps = list() //list of all surgery steps |BS12 +var/global/list/side_effects = list() //list of all medical sideeffects types by thier names |BS12 var/global/list/mechas_list = list() //list of all mechs. Used by hostile mobs target tracking. //Languages/species/whitelist. @@ -75,6 +76,13 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al surgery_steps += S sort_surgeries() + //Medical side effects. List all effects by their names + paths = typesof(/datum/medical_effect)-/datum/medical_effect + for(var/T in paths) + var/datum/medical_effect/M = new T + side_effects[S.name] = T + + //Languages and species. paths = typesof(/datum/language)-/datum/language for(var/T in paths) From 6d369caae7b972cacac7ed2b87ee90ef62012ab7 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 8 Nov 2013 03:55:22 +0400 Subject: [PATCH 03/38] Replaces long check with lots of get_organ calls with shorter one. Also changed weird condition that amputated leg must not be splinted. Removed checks for haslimbs, since movement while downed is not possible anyway. Moved some special effects for broken limbs after check for such, so healthy ones wont bother. Fixed a derp in populating the global list of sideffects. --- code/__HELPERS/global_lists.dm | 2 +- code/modules/organs/organ.dm | 43 +++++++--------------------------- 2 files changed, 10 insertions(+), 35 deletions(-) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 9625d9c716a..ce8d788f25f 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -80,7 +80,7 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al paths = typesof(/datum/medical_effect)-/datum/medical_effect for(var/T in paths) var/datum/medical_effect/M = new T - side_effects[S.name] = T + side_effects[M.name] = T //Languages and species. diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 45828edc2aa..33ce1131c54 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -91,7 +91,7 @@ I.take_damage(rand(3,5)) //Special effects for limbs. - if(E.name in list("l_hand","l_arm","r_hand","r_arm")) + if(E.name in list("l_hand","l_arm","r_hand","r_arm") && (broken||malfunction)) var/obj/item/c_hand //Getting what's in this hand if(E.name == "l_hand" || E.name == "l_arm") c_hand = l_hand @@ -99,8 +99,7 @@ c_hand = r_hand if (c_hand) - if (broken||malfunction) - u_equip(c_hand) + u_equip(c_hand) if(broken) emote("me", 1, "screams in pain and drops what they were holding in their [E.display_name?"[E.display_name]":"[E]"]!") @@ -124,35 +123,11 @@ paralysis = 10 //Check arms and legs for existence - var/canstand_l = 1 //Can stand on left leg - var/canstand_r = 1 //Can stand on right leg - var/hasleg_l = 1 //Have left leg - var/hasleg_r = 1 //Have right leg - var/hasarm_l = 1 //Have left arm - var/hasarm_r = 1 //Have right arm - var/datum/organ/external/E - E = get_organ("l_leg") - if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED)) - canstand_l = 0 - hasleg_l = 0 - E = get_organ("r_leg") - if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED)) - canstand_r = 0 - hasleg_r = 0 - E = get_organ("l_foot") - if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED)) - canstand_l = 0 - E = get_organ("r_foot") - if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED)) - canstand_r = 0 - E = get_organ("l_arm") - if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED)) - hasarm_l = 0 - E = get_organ("r_arm") - if(E.status & ORGAN_DESTROYED && !(E.status & ORGAN_SPLINTED)) - hasarm_r = 0 + can_stand = 2 //can stand on both legs + var/datum/organ/external/E = organs_by_name["l_foot"] + if(E.status & ORGAN_DESTROYED) + can_stand-- - // Can stand if have at least one full leg (with leg and foot parts present) - // Has limbs to move around if at least one arm or leg is at least partially there - can_stand = canstand_l||canstand_r - has_limbs = hasleg_l||hasleg_r||hasarm_l||hasarm_r + E = organs_by_name["r_foot"] + if(E.status & ORGAN_DESTROYED) + can_stand-- From 3992888ea6f0fafda363c73ee11488d1d28e808c Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 8 Nov 2013 04:34:37 +0400 Subject: [PATCH 04/38] removed some unneeded icon update calls (haha totally unneeded yeah) replaced complete regenerate_icons with just body_update in case of dropping limb --- code/modules/organs/organ_external.dm | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index e3488a7cbef..4a182962c57 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -415,10 +415,6 @@ This function completely restores a damaged organ to perfect condition. var/n_is = damage_state_text() if (n_is != damage_state) damage_state = n_is - if(status & ORGAN_DESTROYED) - owner.update_body(1) - else - owner.UpdateDamageIcon(1) return 1 return 0 @@ -550,7 +546,7 @@ This function completely restores a damaged organ to perfect condition. var/lol = pick(cardinal) step(organ,lol) - owner.regenerate_icons() + owner.update_body(1) /**************************************************** From d1be0cba0b13226a4650e789911260a0040677c4 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 8 Nov 2013 08:10:50 +0400 Subject: [PATCH 05/38] Healing wounds should properly update damage overlay if needed. --- code/modules/organs/organ_external.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 4a182962c57..14171bd8697 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -203,7 +203,6 @@ This function completely restores a damaged organ to perfect condition. implants -= implanted_object owner.updatehealth() - update_icon() /datum/organ/external/proc/createwound(var/type = CUT, var/damage) @@ -290,7 +289,6 @@ This function completely restores a damaged organ to perfect condition. perma_injury = 0 update_germs() - update_icon() return //Updating germ levels. Handles organ germ levels and necrosis. @@ -383,6 +381,8 @@ This function completely restores a damaged organ to perfect condition. // sync the organ's damage with its wounds src.update_damages() + if (update_icon()) + owner.UpdateDamageIcon(1) //Updates brute_damn and burn_damn from wound damages. Updates BLEEDING status. /datum/organ/external/proc/update_damages() From b5671e8bd8afcfe5cea025cb1cb3e3d8f1199ee6 Mon Sep 17 00:00:00 2001 From: LightningIron Date: Sun, 10 Nov 2013 12:48:23 -0600 Subject: [PATCH 06/38] Surgery grammar fixes --- code/modules/surgery/appendix.dm | 4 ++-- code/modules/surgery/bones.dm | 4 ++-- code/modules/surgery/braincore.dm | 28 ++++++++++++++-------------- code/modules/surgery/face.dm | 8 ++++---- code/modules/surgery/generic.dm | 16 ++++++++-------- code/modules/surgery/implant.dm | 2 +- code/modules/surgery/ribcage.dm | 10 +++++----- code/modules/surgery/robolimbs.dm | 18 +++++++++--------- 8 files changed, 45 insertions(+), 45 deletions(-) diff --git a/code/modules/surgery/appendix.dm b/code/modules/surgery/appendix.dm index 54a26427fcf..ede75704ee0 100644 --- a/code/modules/surgery/appendix.dm +++ b/code/modules/surgery/appendix.dm @@ -31,8 +31,8 @@ return ..() && target.op_stage.appendix == 0 begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] starts to separating [target]'s appendix from the abdominal wall with \the [tool].", \ - "You start to separating [target]'s appendix from the abdominal wall with \the [tool]." ) + user.visible_message("[user] starts to separate [target]'s appendix from the abdominal wall with \the [tool].", \ + "You start to separate [target]'s appendix from the abdominal wall with \the [tool]." ) target.custom_pain("The pain in your abdomen is living hell!",1) ..() diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index 75e3b6e0997..d0d30cfd209 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -88,8 +88,8 @@ return affected.name == "head" && affected.open == 2 && affected.stage == 1 begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] is beginning piece together [target]'s skull with \the [tool]." , \ - "You are beginning piece together [target]'s skull with \the [tool].") + user.visible_message("[user] is beginning to piece together [target]'s skull with \the [tool]." , \ + "You are beginning to piece together [target]'s skull with \the [tool].") ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/modules/surgery/braincore.dm b/code/modules/surgery/braincore.dm index c95904dcd7c..d94615c953f 100644 --- a/code/modules/surgery/braincore.dm +++ b/code/modules/surgery/braincore.dm @@ -27,8 +27,8 @@ ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] has cut through [target]'s skull open with \the [tool].", \ - "\blue You have cut through [target]'s skull open with \the [tool].") + user.visible_message("\blue [user] has cut [target]'s skull open with \the [tool].", \ + "\blue You have cut [target]'s skull open with \the [tool].") target.brain_op_stage = 2 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -122,13 +122,13 @@ return ..() && target.brain_op_stage == 2 begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] starts taking out bone chips out of [target]'s brain with \the [tool].", \ - "You start taking out bone chips out of [target]'s brain with \the [tool].") + user.visible_message("[user] starts taking bone chips out of [target]'s brain with \the [tool].", \ + "You start taking bone chips out of [target]'s brain with \the [tool].") ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] takes out all bone chips out of [target]'s brain with \the [tool].", \ - "\blue You take out all bone chips out of [target]'s brain with \the [tool].") + user.visible_message("\blue [user] takes out all the bone chips in [target]'s brain with \the [tool].", \ + "\blue You take out all the bone chips in [target]'s brain with \the [tool].") target.brain_op_stage = 3 @@ -189,12 +189,12 @@ return ..() && target.brain_op_stage == 0 begin_step(mob/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message("[user] starts cutting [target]'s flesh with \the [tool].", \ - "You start cutting [target]'s flesh with \the [tool].") + user.visible_message("[user] starts cutting through [target]'s flesh with \the [tool].", \ + "You start cutting through [target]'s flesh with \the [tool].") end_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] cuts [target]'s flesh with \the [tool].", \ - "\blue You cut [target]'s flesh with \the [tool], exposing the cores") + user.visible_message("\blue [user] cuts through [target]'s flesh with \the [tool].", \ + "\blue You cut through [target]'s flesh with \the [tool], exposing the cores.") target.brain_op_stage = 1 fail_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) @@ -219,8 +219,8 @@ "You start cutting [target]'s silky innards apart with \the [tool].") end_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] cuts [target]'s innards apart with \the [tool], exposing the cores", \ - "\blue You cut [target]'s innards apart with \the [tool], exposing the cores") + user.visible_message("\blue [user] cuts [target]'s innards apart with \the [tool], exposing the cores.", \ + "\blue You cut [target]'s innards apart with \the [tool], exposing the cores.") target.brain_op_stage = 2 fail_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) @@ -256,5 +256,5 @@ fail_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message("\red [user]'s hand slips, failing to cut core out!", \ - "\red Your hand slips, failing to cut core out!") \ No newline at end of file + user.visible_message("\red [user]'s hand slips, causing \him to miss the core!", \ + "\red Your hand slips, causing you to miss the core!") \ No newline at end of file diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm index e215487d0b7..b3569b08873 100644 --- a/code/modules/surgery/face.dm +++ b/code/modules/surgery/face.dm @@ -85,13 +85,13 @@ return ..() && target.op_stage.face == 2 begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] starts pulling skin on [target]'s face back in place with \the [tool].", \ - "You start pulling skin on [target]'s face back in place with \the [tool].") + user.visible_message("[user] starts pulling the skin on [target]'s face back in place with \the [tool].", \ + "You start pulling the skin on [target]'s face back in place with \the [tool].") ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] pulls skin on [target]'s face back in place with \the [tool].", \ - "\blue You pull skin on [target]'s face back in place with \the [tool].") + user.visible_message("\blue [user] pulls the skin on [target]'s face back in place with \the [tool].", \ + "\blue You pull the skin on [target]'s face back in place with \the [tool].") target.op_stage.face = 3 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index ede924d8b48..9ebf546d449 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -52,8 +52,8 @@ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, slicing open [target]'s [affected.display_name] in a wrong spot with \the [tool]!", \ - "\red Your hand slips, slicing open [target]'s [affected.display_name] in a wrong spot with \the [tool]!") + user.visible_message("\red [user]'s hand slips, slicing open [target]'s [affected.display_name] in the wrong place with \the [tool]!", \ + "\red Your hand slips, slicing open [target]'s [affected.display_name] in the wrong place with \the [tool]!") affected.createwound(CUT, 10) /datum/surgery_step/generic/clamp_bleeders @@ -133,14 +133,14 @@ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) - var/msg = "\red [user]'s hand slips, tearing the edges of incision on [target]'s [affected.display_name] with \the [tool]!" - var/self_msg = "\red Your hand slips, tearing the edges of incision on [target]'s [affected.display_name] with \the [tool]!" + var/msg = "\red [user]'s hand slips, tearing the edges of the incision on [target]'s [affected.display_name] with \the [tool]!" + var/self_msg = "\red Your hand slips, tearing the edges of the incision on [target]'s [affected.display_name] with \the [tool]!" if (target_zone == "chest") - msg = "\red [user]'s hand slips, damaging several organs [target]'s torso with \the [tool]!" - self_msg = "\red Your hand slips, damaging several organs [target]'s torso with \the [tool]!" + msg = "\red [user]'s hand slips, damaging several organs in [target]'s torso with \the [tool]!" + self_msg = "\red Your hand slips, damaging several organs in [target]'s torso with \the [tool]!" if (target_zone == "groin") - msg = "\red [user]'s hand slips, damaging several organs [target]'s lower abdomen with \the [tool]" - self_msg = "\red Your hand slips, damaging several organs [target]'s lower abdomen with \the [tool]!" + msg = "\red [user]'s hand slips, damaging several organs in [target]'s lower abdomen with \the [tool]" + self_msg = "\red Your hand slips, damaging several organs in [target]'s lower abdomen with \the [tool]!" user.visible_message(msg, self_msg) target.apply_damage(12, BRUTE, affected) diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index edc89ac0ac2..01d54bedaaf 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -123,7 +123,7 @@ user.visible_message("\blue [user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ "\blue You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) if (tool.w_class > get_max_wclass(affected)/2 && prob(50)) - user << "\red You tear some vessels trying to fit such big object in this cavity." + user << "\red You tear some blood vessels trying to fit such a big object in this cavity." var/datum/wound/internal_bleeding/I = new (15) affected.wounds += I affected.owner.custom_pain("You feel something rip in your [affected.display_name]!", 1) diff --git a/code/modules/surgery/ribcage.dm b/code/modules/surgery/ribcage.dm index 48a22b27e1a..747d8a4363d 100644 --- a/code/modules/surgery/ribcage.dm +++ b/code/modules/surgery/ribcage.dm @@ -31,8 +31,8 @@ ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] has cut through [target]'s ribcage open with \the [tool].", \ - "\blue You have cut through [target]'s ribcage open with \the [tool].") + user.visible_message("\blue [user] has cut [target]'s ribcage open with \the [tool].", \ + "\blue You have cut [target]'s ribcage open with \the [tool].") target.op_stage.ribcage = 1 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -111,14 +111,14 @@ target.op_stage.ribcage = 1 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/msg = "\red [user]'s hand slips, bending [target]'s ribcage in a wrong shape!" - var/self_msg = "\red Your hand slips, bending [target]'s ribcage in a wrong shape!" + var/msg = "\red [user]'s hand slips, bending [target]'s ribs the wrong way!" + var/self_msg = "\red Your hand slips, bending [target]'s ribs the wrong way!" user.visible_message(msg, self_msg) var/datum/organ/external/chest/affected = target.get_organ("chest") affected.createwound(BRUISE, 20) affected.fracture() if (prob(40)) - user.visible_message("\red Rib pierces the lung!") + user.visible_message("\red A rib pierces the lung!") target.rupture_lung() /datum/surgery_step/ribcage/mend_ribcage diff --git a/code/modules/surgery/robolimbs.dm b/code/modules/surgery/robolimbs.dm index 97db2846220..8faa6b65113 100644 --- a/code/modules/surgery/robolimbs.dm +++ b/code/modules/surgery/robolimbs.dm @@ -46,7 +46,7 @@ if (affected.parent) affected = affected.parent user.visible_message("\red [user]'s hand slips, cutting [target]'s [affected.display_name] open!", \ - "\red Your hand slips, cutting [target]'s [affected.display_name] open!") + "\red Your hand slips, cutting [target]'s [affected.display_name] open!") affected.createwound(CUT, 10) @@ -65,8 +65,8 @@ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] is beginning reposition flesh and nerve endings where where [target]'s [affected.display_name] used to be with [tool].", \ - "You start repositioning flesh and nerve endings where where [target]'s [affected.display_name] used to be with [tool].") + user.visible_message("[user] is beginning to reposition flesh and nerve endings where where [target]'s [affected.display_name] used to be with [tool].", \ + "You start repositioning flesh and nerve endings where [target]'s [affected.display_name] used to be with [tool].") ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -101,8 +101,8 @@ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] starts adjusting area around [target]'s [affected.display_name] with \the [tool].", \ - "You start adjusting area around [target]'s [affected.display_name] with \the [tool]..") + user.visible_message("[user] starts adjusting the area around [target]'s [affected.display_name] with \the [tool].", \ + "You start adjusting the area around [target]'s [affected.display_name] with \the [tool].") ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -140,14 +140,14 @@ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] starts attaching [tool] where [target]'s [affected.display_name] used to be.", \ - "You start attaching [tool] where [target]'s [affected.display_name] used to be.") + user.visible_message("[user] starts attaching \the [tool] where [target]'s [affected.display_name] used to be.", \ + "You start attaching \the [tool] where [target]'s [affected.display_name] used to be.") end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/robot_parts/L = tool var/datum/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\blue [user] has attached [tool] where [target]'s [affected.display_name] used to be.", \ - "\blue You have attached [tool] where [target]'s [affected.display_name] used to be.") + user.visible_message("\blue [user] has attached \the [tool] where [target]'s [affected.display_name] used to be.", \ + "\blue You have attached \the [tool] where [target]'s [affected.display_name] used to be.") affected.robotize() if(L.sabotaged) affected.sabotaged = 1 From 8696d4fbd94e4a5497506c0d932deda6559881b6 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Tue, 12 Nov 2013 02:10:01 +0300 Subject: [PATCH 07/38] No nullname ID cards --- code/game/objects/items/weapons/cards_ids.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index c0339639955..2ca53be3ee7 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -127,7 +127,7 @@ icon_state = "id" item_state = "card-id" var/access = list() - var/registered_name = null // The name registered_name on the card + var/registered_name = "Unknown" // The name registered_name on the card slot_flags = SLOT_ID var/blood_type = "\[UNSET\]" @@ -280,4 +280,4 @@ assignment = "General" New() access = get_all_centcom_access() - ..() \ No newline at end of file + ..() From 99321389f27b42982bd173ca857852c4b46430a8 Mon Sep 17 00:00:00 2001 From: Kilakk Date: Thu, 14 Nov 2013 21:45:25 -0500 Subject: [PATCH 08/38] Fixes #3886, ATMs no longer log you in automagically Silly security level 0 ruined everything Added a tiny sanity check as well to avoid runtimes --- code/modules/economy/ATM.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 32dc6cbc9d3..398d311c189 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -97,8 +97,6 @@ log transactions user << "\red Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per NanoTrasen regulation #1005." return if(get_dist(src,user) <= 1) - //check to see if the user has low security enabled - scan_user(user) //js replicated from obj/machinery/computer/card var/dat = "

NanoTrasen Automatic Teller Machine

" @@ -223,7 +221,11 @@ log transactions var/new_sec_level = max( min(text2num(href_list["new_security_level"]), 2), 0) authenticated_account.security_level = new_sec_level if("attempt_auth") - if(!ticks_left_locked_down) + + // check if they have low security enabled + scan_user(usr) + + if(!ticks_left_locked_down && held_card) var/tried_account_num = text2num(href_list["account_num"]) if(!tried_account_num) tried_account_num = held_card.associated_account_number @@ -363,3 +365,5 @@ log transactions T.date = current_date_string T.time = worldtime2text() authenticated_account.transaction_log.Add(T) + + view_screen = NO_SCREEN \ No newline at end of file From 734d89c669e1f078e40a589b91a8dabd5250ab64 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Fri, 15 Nov 2013 01:00:25 -0600 Subject: [PATCH 09/38] BugFix: Cult Ghosts...after a bit of professional advise from chinsky. Problem: Cult members can't use the rune to see ghosts, then beat ghosts over the head. it was being intercepted by _onclick and processed there and only displaying an angry red notice that you hit that ghost. Ghost didn't become visible, it disappeared soon after moving off the rune. Solution: Made an attackby for ghosts to check when they are being beat up by cultist with books, now they appear. Minor feature change: Now if a visible ghost gets hit it will give a different message than the standard "Ghost is pulled through from the other side". --- code/modules/mob/dead/observer/observer.dm | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index ae544c43d54..e06d7ed2633 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -63,6 +63,23 @@ real_name = name ..() + +/mob/dead/attackby(obj/item/W, mob/user) + if(istype(W,/obj/item/weapon/tome)) + var/mob/dead/M = src + if(src.invisibility != 0) + M.invisibility = 0 + user.visible_message( \ + "\red [user] drags ghost, [M], to our plan of reality!", \ + "\red You drag [M] to our plan of reality!" \ + ) + else + user.visible_message ( \ + "\red [user] just tried to smash his book into that ghost! It's not very effective", \ + "\red You get the feeling that the ghost can't become any more visible." \ + ) + + /mob/dead/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) return 1 /* From 4ccf7d0a08c9429065e6c0512ca61ef96a6fba9f Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Fri, 15 Nov 2013 22:01:35 -0600 Subject: [PATCH 10/38] Bugfix (3778) Power cells in exosuits have the same amount of power as a highcap cell Issue: Mechs are created/spawned with a high-capaciter cell that is named "Power cell" and confuses some of the less bright roboticists and their beards. Solution: Shave the roboticist, and also renamed the cell that spawns to properly reflect it's higher capacity. --- code/game/mecha/mecha.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 1b47d6f9a90..65284a054d1 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -115,6 +115,7 @@ cell = C return cell = new(src) + cell.name = "high-capacity power cell" cell.charge = 15000 cell.maxcharge = 15000 From ab06251c32a489d5705778e5afc5ada22e534a36 Mon Sep 17 00:00:00 2001 From: Nanai Date: Sat, 16 Nov 2013 02:01:16 -0500 Subject: [PATCH 11/38] Event Rebalance! As per request, events have been rebalanced to be a bit more even and vastly less appendicitis. Event timers have been increased from 15-25 minutes to 20-40 minutes. --- code/modules/events/event_dynamic.dm | 30 ++++++++++++++-------------- code/modules/events/event_manager.dm | 4 ++-- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/code/modules/events/event_dynamic.dm b/code/modules/events/event_dynamic.dm index 93142e02614..8a5b3b61b26 100644 --- a/code/modules/events/event_dynamic.dm +++ b/code/modules/events/event_dynamic.dm @@ -44,39 +44,39 @@ var/list/event_last_fired = 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] = 300 + possibleEvents[/datum/event/trivial_news] = 400 + possibleEvents[/datum/event/mundane_news] = 300 possibleEvents[/datum/event/pda_spam] = max(min(25, player_list.len) * 4, 200) possibleEvents[/datum/event/money_lotto] = max(min(5, player_list.len), 50) if(account_hack_attempted) possibleEvents[/datum/event/money_hacker] = max(min(25, player_list.len) * 4, 200) - possibleEvents[/datum/event/carp_migration] = 50 + 50 * active_with_role["Engineer"] - possibleEvents[/datum/event/brand_intelligence] = 50 + 25 * active_with_role["Janitor"] + possibleEvents[/datum/event/carp_migration] = 20 + 10 * active_with_role["Engineer"] + possibleEvents[/datum/event/brand_intelligence] = 20 + 25 * active_with_role["Janitor"] - possibleEvents[/datum/event/rogue_drone] = 25 + 25 * active_with_role["Engineer"] + 25 * active_with_role["Security"] - possibleEvents[/datum/event/infestation] = 50 + 25 * active_with_role["Janitor"] + possibleEvents[/datum/event/rogue_drone] = 5 + 25 * active_with_role["Engineer"] + 25 * active_with_role["Security"] + possibleEvents[/datum/event/infestation] = 100 + 100 * active_with_role["Janitor"] possibleEvents[/datum/event/communications_blackout] = 50 + 25 * active_with_role["AI"] + active_with_role["Scientist"] * 25 possibleEvents[/datum/event/ionstorm] = active_with_role["AI"] * 25 + active_with_role["Cyborg"] * 25 + active_with_role["Engineer"] * 10 + active_with_role["Scientist"] * 5 - possibleEvents[/datum/event/grid_check] = 25 + 20 * active_with_role["Engineer"] - possibleEvents[/datum/event/electrical_storm] = 10 * active_with_role["Janitor"] + 5 * active_with_role["Engineer"] + possibleEvents[/datum/event/grid_check] = 25 + 10 * active_with_role["Engineer"] + possibleEvents[/datum/event/electrical_storm] = 15 * active_with_role["Janitor"] + 5 * active_with_role["Engineer"] possibleEvents[/datum/event/wallrot] = 30 * active_with_role["Engineer"] + 50 * active_with_role["Botanist"] if(!spacevines_spawned) - possibleEvents[/datum/event/spacevine] = 5 + 5 * active_with_role["Engineer"] + possibleEvents[/datum/event/spacevine] = 10 + 5 * active_with_role["Engineer"] if(minutes_passed >= 30) // Give engineers time to set up engine possibleEvents[/datum/event/meteor_wave] = 10 * active_with_role["Engineer"] - possibleEvents[/datum/event/meteor_shower] = 40 * active_with_role["Engineer"] + possibleEvents[/datum/event/meteor_shower] = 20 * active_with_role["Engineer"] possibleEvents[/datum/event/blob] = 20 * 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"] * 15 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 - possibleEvents[/datum/event/viral_infection] = active_with_role["Medical"] * 10 + possibleEvents[/datum/event/radiation_storm] = active_with_role["Medical"] * 10 + possibleEvents[/datum/event/spontaneous_appendicitis] = active_with_role["Medical"] * 10 + possibleEvents[/datum/event/viral_infection] = active_with_role["Medical"] * 20 possibleEvents[/datum/event/organ_failure] = active_with_role["Medical"] * 50 possibleEvents[/datum/event/prison_break] = active_with_role["Security"] * 50 diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm index 89347a299d9..52fbc8220a8 100644 --- a/code/modules/events/event_manager.dm +++ b/code/modules/events/event_manager.dm @@ -2,8 +2,8 @@ var/list/allEvents = typesof(/datum/event) - /datum/event var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event //var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event - /datum/event/spider_infestation - /datum/event/alien_infestation -var/eventTimeLower = 9000 //15 minutes -var/eventTimeUpper = 15000 //25 minutes +var/eventTimeLower = 12000 //20 minutes +var/eventTimeUpper = 24000 //40 minutes var/scheduledEvent = null From 08a3226f0794405984e74c522b67ab0b86d1a675 Mon Sep 17 00:00:00 2001 From: Mloc-Argent Date: Sun, 17 Nov 2013 15:03:50 +0000 Subject: [PATCH 12/38] Fix for the config .gitignore. Signed-off-by: Mloc-Argent --- .gitignore | 6 ------ config/.gitignore | 3 +++ 2 files changed, 3 insertions(+), 6 deletions(-) create mode 100644 config/.gitignore diff --git a/.gitignore b/.gitignore index 0dc17248d0c..7daab156185 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,3 @@ *.rsc *.dmb *.lk - -#ignore any files in config/, except those in subdirectories. -/config/* -!/config/*/* - -/baystation12.int diff --git a/config/.gitignore b/config/.gitignore new file mode 100644 index 00000000000..ec7ed9b452e --- /dev/null +++ b/config/.gitignore @@ -0,0 +1,3 @@ +#ignore everything here, except subdirectories. +* +!*/ From b75380985e273f172653cd9115b77a31e216c62e Mon Sep 17 00:00:00 2001 From: DJSnapshot Date: Sun, 17 Nov 2013 11:54:43 -0800 Subject: [PATCH 13/38] Using a better method to handle autotransfers. Old method was silly. --- baystation12.dme | 1 + code/controllers/voting.dm | 1 - code/game/gamemodes/gameticker.dm | 14 -------------- 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/baystation12.dme b/baystation12.dme index a5cf03ea1e6..aaf9eab8aff 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -75,6 +75,7 @@ #include "code\ATMOSPHERICS\components\unary\vent_pump.dm" #include "code\ATMOSPHERICS\components\unary\vent_scrubber.dm" #include "code\controllers\_DynamicAreaLighting_TG.dm" +#include "code\controllers\autotransfer.dm" #include "code\controllers\configuration.dm" #include "code\controllers\failsafe.dm" #include "code\controllers\lighting_controller.dm" diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index 452c174b356..92f55a3fd64 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -50,7 +50,6 @@ datum/controller/vote initiate_vote("crew_transfer","the server") log_debug("The server has called an Autotransfer") - proc/reset() initiator = null time_remaining = 0 diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index a03068371f0..ea9fbaec4a7 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -36,8 +36,6 @@ var/global/datum/controller/gameticker/ticker var/triai = 0//Global holder for Triumvirate - var/initialtpass = 0 //holder for inital autotransfer vote timer - /datum/controller/gameticker/proc/pregame() login_music = pick(\ /*'sound/music/halloween/skeletons.ogg',\ @@ -63,17 +61,6 @@ var/global/datum/controller/gameticker/ticker current_state = GAME_STATE_SETTING_UP while (!setup()) -/datum/controller/gameticker/proc/votetimer() - var/timerbuffer = 0 - if (initialtpass == 0) - timerbuffer = config.vote_autotransfer_initial - else - timerbuffer = config.vote_autotransfer_interval - spawn(timerbuffer) - vote.autotransfer() - initialtpass = 1 - votetimer() - /datum/controller/gameticker/proc/setup() //Create and announce mode @@ -166,7 +153,6 @@ var/global/datum/controller/gameticker/ticker spawn(3000) statistic_cycle() // Polls population totals regularly and stores them in an SQL DB -- TLE - votetimer() return 1 /datum/controller/gameticker From 9936a9251facf2a923c0f5a53984bf6450488f0a Mon Sep 17 00:00:00 2001 From: DJSnapshot Date: Sun, 17 Nov 2013 11:55:57 -0800 Subject: [PATCH 14/38] Helps to add the actual new file. --- code/controllers/autotransfer.dm | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 code/controllers/autotransfer.dm diff --git a/code/controllers/autotransfer.dm b/code/controllers/autotransfer.dm new file mode 100644 index 00000000000..c69290c7bd8 --- /dev/null +++ b/code/controllers/autotransfer.dm @@ -0,0 +1,13 @@ +var/datum/controller/transfer_controller = new /transfer_controller() +var/timerbuffer = 0 //buffer for time check +/transfer_controller/New() + timerbuffer = config.vote_autotransfer_initial + processing_objects += src + +/transfer_controller/Del() + processing_objects -= src + +/transfer_controller/proc/process() + if (world.time >= timerbuffer - 600) + vote.autotransfer() + timerbuffer = timerbuffer + config.vote_autotransfer_interval \ No newline at end of file From 457835db38d50ef8b5ee001b134d22c73a0d3580 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Sun, 17 Nov 2013 18:16:42 -0600 Subject: [PATCH 15/38] Admin request: Jobbans for IA and ERT --- code/modules/admin/topic.dm | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index f1c911488ab..6f25d8b05a1 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -510,6 +510,12 @@ if(counter >= 5) //So things dont get squiiiiished! jobs += "" counter = 0 + + if(jobban_isbanned(M, "Internal Affairs Agent")) + jobs += "Internal Affairs Agent" + else + jobs += "Internal Affairs Agent" + jobs += "" //Non-Human (Green) @@ -583,6 +589,13 @@ else jobs += "[replacetext("Wizard", " ", " ")]" + //ERT + if(jobban_isbanned(M, "Emergency Response Team") || isbanned_dept) + jobs += "Emergency Response Team" + else + jobs += "Emergency Response Team" + + /* //Malfunctioning AI //Removed Malf-bans because they're a pain to impliment if(jobban_isbanned(M, "malf AI") || isbanned_dept) jobs += "[replacetext("Malf AI", " ", " ")]" @@ -2594,4 +2607,4 @@ show_player_info(ckey) if("list") PlayerNotesPage(text2num(href_list["index"])) - return \ No newline at end of file + return From 2a95cdd2966830b2a9a7617c6c970ebd58db55ca Mon Sep 17 00:00:00 2001 From: ZekeSulastin Date: Wed, 20 Nov 2013 17:07:05 -0500 Subject: [PATCH 16/38] Scalpels also mangle gloves for nonhuman wear. --- code/modules/clothing/gloves/stungloves.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/clothing/gloves/stungloves.dm b/code/modules/clothing/gloves/stungloves.dm index fde681a4eab..7b52f3e4c90 100644 --- a/code/modules/clothing/gloves/stungloves.dm +++ b/code/modules/clothing/gloves/stungloves.dm @@ -32,7 +32,7 @@ else user << "[src] already have a cell." - else if(istype(W, /obj/item/weapon/wirecutters)) + else if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/scalpel)) wired = null @@ -43,7 +43,7 @@ cell = null if(clipped == 0) playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) - user.visible_message("\red [user] snips the fingertips off [src].","\red You snip the fingertips off [src].") + user.visible_message("\red [user] cut the fingertips off [src].","\red You cut the fingertips off [src].") clipped = 1 if("exclude" in species_restricted) name = "mangled [name]" @@ -78,4 +78,4 @@ if(wired) overlays += "gloves_wire" if(cell) - overlays += "gloves_cell" \ No newline at end of file + overlays += "gloves_cell" From 34fb26a64954ccb36eafba38c4cd809b367cb777 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Wed, 20 Nov 2013 17:11:21 -0600 Subject: [PATCH 17/38] Ravensdale request: Detomax cartridge use will not create an admin message saying the name/key of the antag that tried to blow up the target, and if it was successful or not. --- code/game/objects/items/devices/PDA/PDA.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 1cdd99d1339..5367de7d951 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -715,8 +715,10 @@ var/global/list/obj/item/device/pda/PDAs = list() U.show_message("\red Energy feeds back into your [src]!", 1) U << browse(null, "window=pda") explode() + message_admins("Admin [U] ([U.Key]) just attempted to blow up [P] with the Detomax cartridge but failed, blowing himself up", 1) else U.show_message("\blue Success!", 1) + message_admins("Admin [U] ([U.Key]) just attempted to blow up [P] with the Detomax cartridge and succeded", 1) P.explode() else U << "PDA not found." @@ -1193,4 +1195,4 @@ var/global/list/obj/item/device/pda/PDAs = list() // Pass along the pulse to atoms in contents, largely added so pAIs are vulnerable to EMP /obj/item/device/pda/emp_act(severity) for(var/atom/A in src) - A.emp_act(severity) \ No newline at end of file + A.emp_act(severity) From d1ca50f384b1d33b1526790d121e548480bc146f Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Wed, 20 Nov 2013 17:24:39 -0600 Subject: [PATCH 18/38] Bugfix: Yeah variables are case sensitive. Lesson learned: Always compile before commit, unless attempting to pad your commit count. --- code/game/objects/items/devices/PDA/PDA.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 5367de7d951..0fbac7f2b7c 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -715,10 +715,10 @@ var/global/list/obj/item/device/pda/PDAs = list() U.show_message("\red Energy feeds back into your [src]!", 1) U << browse(null, "window=pda") explode() - message_admins("Admin [U] ([U.Key]) just attempted to blow up [P] with the Detomax cartridge but failed, blowing himself up", 1) + message_admins("Admin [U] ([U.key]) just attempted to blow up [P] with the Detomax cartridge but failed, blowing himself up", 1) else U.show_message("\blue Success!", 1) - message_admins("Admin [U] ([U.Key]) just attempted to blow up [P] with the Detomax cartridge and succeded", 1) + message_admins("Admin [U] ([U.key]) just attempted to blow up [P] with the Detomax cartridge and succeded", 1) P.explode() else U << "PDA not found." From 7d545437a3e33062719d3e5739b654a20d18095c Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Wed, 20 Nov 2013 17:49:11 -0600 Subject: [PATCH 19/38] Spelling mistake. Commit_Count++ --- code/game/objects/items/devices/PDA/PDA.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 0fbac7f2b7c..f8aebace5b1 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -715,10 +715,10 @@ var/global/list/obj/item/device/pda/PDAs = list() U.show_message("\red Energy feeds back into your [src]!", 1) U << browse(null, "window=pda") explode() - message_admins("Admin [U] ([U.key]) just attempted to blow up [P] with the Detomax cartridge but failed, blowing himself up", 1) + message_admins("[U] ([U.key]) just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up", 1) else U.show_message("\blue Success!", 1) - message_admins("Admin [U] ([U.key]) just attempted to blow up [P] with the Detomax cartridge and succeded", 1) + message_admins("[U] ([U.key]) just attempted to blow up [P] with the Detomatix cartridge and succeded", 1) P.explode() else U << "PDA not found." From 8c2846055068ad27a026c1801c126ef847b9c505 Mon Sep 17 00:00:00 2001 From: ZekeSulastin Date: Thu, 21 Nov 2013 15:10:03 -0500 Subject: [PATCH 20/38] Cloning scanner saves languages in records. --- code/game/machinery/computer/cloning.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 3adeccdf91e..184cc8e8670 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -313,7 +313,7 @@ else if(!config.revival_cloning) temp = "Error: Unable to initiate cloning cycle." - else if(pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"])) + else if(pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["languages"])) temp = "Initiating cloning cycle..." records.Remove(C) del(C) @@ -323,7 +323,7 @@ var/mob/selected = find_dead_player("[C.fields["ckey"]]") selected << 'sound/machines/chime.ogg' //probably not the best sound but I think it's reasonable var/answer = alert(selected,"Do you want to return to life?","Cloning","Yes","No") - if(answer != "No" && pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["interface"])) + if(answer != "No" && pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["languages"], C.fields["interface"])) temp = "Initiating cloning cycle..." records.Remove(C) del(C) @@ -370,6 +370,7 @@ R.fields["id"] = copytext(md5(subject.real_name), 2, 6) R.fields["UI"] = subject.dna.uni_identity R.fields["SE"] = subject.dna.struc_enzymes + R.fields["languages"] = subject.languages //Add an implant if needed var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject) From 3ae79d1e9125bab27d901fa32c783295639c88f0 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Thu, 21 Nov 2013 18:37:23 -0600 Subject: [PATCH 21/38] Admin request: Added admin logging to Detomatix cartridge explosions instead of just admin_messages. --- code/game/objects/items/devices/PDA/PDA.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index f8aebace5b1..29db96bdf2c 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -715,9 +715,11 @@ var/global/list/obj/item/device/pda/PDAs = list() U.show_message("\red Energy feeds back into your [src]!", 1) U << browse(null, "window=pda") explode() + log_admin("[U] ([U.key]) just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up") message_admins("[U] ([U.key]) just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up", 1) else U.show_message("\blue Success!", 1) + log_admin("[U] ([U.key]) just attempted to blow up [P] with the Detomatix cartridge and succeded") message_admins("[U] ([U.key]) just attempted to blow up [P] with the Detomatix cartridge and succeded", 1) P.explode() else From 983ca2d5e3d37519285207590283b2f36db8f99c Mon Sep 17 00:00:00 2001 From: DJSnapshot Date: Thu, 21 Nov 2013 17:44:31 -0800 Subject: [PATCH 22/38] Fix for reported issue with the transfer_controller causing a runtime error. Also included is a debug controller for the transfer_controller --- code/controllers/autotransfer.dm | 14 +++++++++----- code/controllers/master_controller.dm | 5 ++++- code/controllers/verbs.dm | 5 ++++- code/controllers/voting.dm | 6 +++++- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/code/controllers/autotransfer.dm b/code/controllers/autotransfer.dm index c69290c7bd8..f1240a1faef 100644 --- a/code/controllers/autotransfer.dm +++ b/code/controllers/autotransfer.dm @@ -1,13 +1,17 @@ -var/datum/controller/transfer_controller = new /transfer_controller() -var/timerbuffer = 0 //buffer for time check -/transfer_controller/New() +var/datum/controller/transfer_controller/transfer_controller + +datum/controller/transfer_controller + var/timerbuffer = 0 //buffer for time check + var/currenttick = 0 +datum/controller/transfer_controller/New() timerbuffer = config.vote_autotransfer_initial processing_objects += src -/transfer_controller/Del() +datum/controller/transfer_controller/Del() processing_objects -= src -/transfer_controller/proc/process() +datum/controller/transfer_controller/proc/process() + currenttick = currenttick + 1 if (world.time >= timerbuffer - 600) vote.autotransfer() timerbuffer = timerbuffer + config.vote_autotransfer_interval \ No newline at end of file diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index d3ddef9f37e..5e7d308a9eb 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -67,6 +67,8 @@ datum/controller/game_controller/proc/setup() setupfactions() setup_economy() + transfer_controller = new + for(var/i=0, i Date: Thu, 21 Nov 2013 22:25:51 -0500 Subject: [PATCH 23/38] Applies language list to cloned mob. --- code/game/machinery/cloning.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 406e5aab98e..e66c7feb44c 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -116,7 +116,7 @@ //Clonepod //Start growing a human clone in the pod! -/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/datum/species/mrace) +/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/datum/species/mrace, var/languages) if(mess || attempting) return 0 var/datum/mind/clonemind = locate(mindref) @@ -195,7 +195,8 @@ H.h_style = pick("Bedhead", "Bedhead 2", "Bedhead 3") H.species = mrace - H.add_language(mrace.language) + for(var/datum/language/L in languages) + H.add_language(L.name) H.update_mutantrace() H.suiciding = 0 src.attempting = 0 @@ -437,4 +438,4 @@ /* EMP grenade/spell effect if(istype(A, /obj/machinery/clonepod)) A:malfunction() -*/ \ No newline at end of file +*/ From 56a066ecfb387324d7a2af5e9fd1c2f275814a84 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Thu, 21 Nov 2013 21:35:23 -0600 Subject: [PATCH 24/38] Bugfix(3937) Blindfolds cause permenent blindness Removed BLIND vision flag from the object as that is already handled in mob/living/carbon/human/life.dm Resolves #3937 --- code/modules/clothing/glasses/glasses.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index be7a028f2aa..607dd9d8082 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -128,7 +128,7 @@ desc = "Covers the eyes, preventing sight." icon_state = "blindfold" item_state = "blindfold" - vision_flags = BLIND + //vision_flags = BLIND // This flag is only supposed to be used if it causes permanent blindness, not temporary because of glasses /obj/item/clothing/glasses/sunglasses/prescription name = "prescription sunglasses" @@ -193,4 +193,4 @@ name = "Optical Thermal Implants" desc = "A set of implantable lenses designed to augment your vision" icon_state = "thermalimplants" - item_state = "syringe_kit" \ No newline at end of file + item_state = "syringe_kit" From 9ddbc905e9c3d69fee114f4085938418f8ec975f Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Fri, 22 Nov 2013 01:12:56 -0600 Subject: [PATCH 25/38] Bugfix(2126) Traitors still have loyalty implants, admins should be able to remove/disable implants Added a proc is_loyalty_implanted() that returns 1 if so, and 0 if not. Added the ability to remove and add loyalty implants from the traitor panel. Changed the checks on antags to not care if they are section heads, but to instead check for a loyalty implant. Fixed a minor bug where traitorborgs made through traitor panel was not adding law 0 Adding a loyalty implant to an antagonist through traitor panel will also remove them from being an antag. --- code/datums/mind.dm | 84 ++++++++++++++----- code/modules/mob/living/carbon/human/human.dm | 8 +- 2 files changed, 69 insertions(+), 23 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 7adc6a9679d..7d25f4da650 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -112,6 +112,7 @@ datum/mind out += "Factions and special roles:
" var/list/sections = list( + "implant", "revolution", "cult", "wizard", @@ -122,19 +123,23 @@ datum/mind "malfunction", ) var/text = "" - + var/mob/living/carbon/human/H = current if (istype(current, /mob/living/carbon/human) || istype(current, /mob/living/carbon/monkey)) + /** Impanted**/ + if(H.is_loyalty_implanted(H)) + text = "Loyalty Implant:Remove|Implanted
" + else + text = "Loyalty Implant:No Implant|Implant him!
" + sections["implant"] = text /** REVOLUTION ***/ text = "revolution" if (ticker.mode.config_tag=="revolution") - text = uppertext(text) + text += uppertext(text) text = "[text]: " - if (assigned_role in command_positions) - text += "HEAD|employee|headrev|rev" -// else if (assigned_role in list("Security Officer", "Detective", "Warden")) -// text += "head|OFFICER|employee|headre|rev" + if (H.is_loyalty_implanted(H)) + text += "LOYAL EMPLOYEE|headrev|rev" else if (src in ticker.mode.head_revolutionaries) - text = "head|employee|HEADREV|rev" + text = "employee|HEADREV|rev" text += "
Flash: give" var/list/L = current.get_contents() @@ -151,9 +156,9 @@ datum/mind if (objectives.len==0) text += "
Objectives are empty! Set to kill all heads." else if (src in ticker.mode.revolutionaries) - text += "head|employee|headrev|REV" + text += "employee|headrev|REV" else - text += "head|EMPLOYEE|headrev|rev" + text += "EMPLOYEE|headrev|rev" sections["revolution"] = text /** CULT ***/ @@ -161,19 +166,17 @@ datum/mind if (ticker.mode.config_tag=="cult") text = uppertext(text) text = "[text]: " - if (assigned_role in command_positions) - text += "HEAD|employee|cultist" -// else if (assigned_role in list("Security Officer", "Detective", "Warden")) -// text += "head|OFFICER|employee|cultist" + if (H.is_loyalty_implanted(H)) + text += "LOYAL EMPLOYEE|cultist" else if (src in ticker.mode.cult) - text += "head|employee|CULTIST" + text += "employee|CULTIST" text += "
Give tome|amulet." /* if (objectives.len==0) text += "
Objectives are empty! Set to sacrifice and escape or summon." */ else - text += "head|EMPLOYEE|cultist" + text += "EMPLOYEE|cultist" sections["cult"] = text /** WIZARD ***/ @@ -232,12 +235,16 @@ datum/mind if (ticker.mode.config_tag=="traitor" || ticker.mode.config_tag=="traitorchan") text = uppertext(text) text = "[text]: " - if (src in ticker.mode.traitors) - text += "TRAITOR|loyal" - if (objectives.len==0) - text += "
Objectives are empty! Randomize!" + if(istype(current, /mob/living/carbon/human)) + if (H.is_loyalty_implanted(H)) + text +="traitor|LOYAL EMPLOYEE" else - text += "traitor|LOYAL" + if (src in ticker.mode.traitors) + text += "TRAITOR|Employee" + if (objectives.len==0) + text += "
Objectives are empty! Randomize!" + else + text += "traitor|Employee" sections["traitor"] = text /** MONKEY ***/ @@ -485,6 +492,39 @@ datum/mind if(!istype(objective)) return objective.completed = !objective.completed + else if(href_list["implant"]) + var/mob/living/carbon/human/H = current + switch(href_list["implant"]) + if("remove") + for(var/obj/item/weapon/implant/loyalty/I in H.contents) + I.Del() + H << "\blue Your loyalty implant has been deactivated." + if("add") + H.contents.Add( new /obj/item/weapon/implant/loyalty (src) ) + H << "\red You somehow have become the recepient of a loyalty transplant, and it just activated!" + if(src in ticker.mode.revolutionaries) + special_role = null + ticker.mode.revolutionaries -= src + src << "\red The nanobots in the loyalty implant remove all thoughts about being a revolutionary. Get back to work!" + if(src in ticker.mode.head_revolutionaries) + special_role = null + ticker.mode.head_revolutionaries -=src + src << "\red The nanobots in the loyalty implant remove all thoughts about being a revolutionary. Get back to work!" + if(src in ticker.mode.cult) + ticker.mode.cult -= src + ticker.mode.update_cult_icons_removed(src) + special_role = null + var/datum/game_mode/cult/cult = ticker.mode + if (istype(cult)) + cult.memoize_cult_objectives(src) + current << "\red The nanobots in the loyalty implant remove all thoughts about being in a cult. Have a productive day!" + memory = "" + if(src in ticker.mode.traitors) + ticker.mode.traitors -= src + special_role = null + current << "\red The nanobots in the loyalty implant remove all thoughts about being a traitor to Nanotrasen. Have a nice day!" + log_admin("[key_name_admin(usr)] has de-traitor'ed [current].") + else if (href_list["revolution"]) switch(href_list["revolution"]) if("clear") @@ -750,8 +790,8 @@ datum/mind special_role = "traitor" current << "\red You are a traitor!" log_admin("[key_name_admin(usr)] has traitor'ed [current].") - if(isAI(current)) - var/mob/living/silicon/ai/A = current + if(istype(current, /mob/living/silicon)) + var/mob/living/silicon/A = current call(/datum/game_mode/proc/add_law_zero)(A) A.show_laws() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 361074fdd82..5b8b01eab50 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -296,6 +296,12 @@ if(armor >= 2) return +/mob/living/carbon/human/proc/is_loyalty_implanted(mob/living/carbon/human/M) + for(var/L in M.contents) + if(istype(L, /obj/item/weapon/implant/loyalty)) + return 1 + return 0 + /mob/living/carbon/human/attack_slime(mob/living/carbon/slime/M as mob) if(M.Victim) return // can't attack while eating! @@ -1257,4 +1263,4 @@ mob/living/carbon/human/yank_out_object() if(species) return 1 else - return 0 \ No newline at end of file + return 0 From f11b964f6c79b9fe266fa48d7f1964c86ded8823 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 22 Nov 2013 23:10:06 +1030 Subject: [PATCH 26/38] Fixes #3921 --- code/modules/clothing/clothing.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 3c76e6753dd..3e40aeb5d5f 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -22,7 +22,7 @@ if(H.species.name in species_restricted) wearable = 1 - if(!wearable) + if(!wearable && (slot != 15 && slot != 16)) //Pockets. M << "\red Your species cannot wear [src]." return 0 From ddabdf90f21622caaa8c5391be267397de5ec269 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 22 Nov 2013 23:17:57 +1030 Subject: [PATCH 27/38] Fixes #3842 --- code/game/gamemodes/nuclear/nuclearbomb.dm | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 7480555d694..5d770346d5e 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -119,6 +119,11 @@ var/bomb_set /obj/machinery/nuclearbomb/attack_hand(mob/user as mob) if (src.extended) + + if (!ishuman(user)) + usr << "\red You don't have the dexterity to do this!" + return 1 + user.set_machine(src) var/dat = text("Nuclear Fission Explosive
\nAuth. Disk: []
", src, (src.auth ? "++++++++++" : "----------")) if (src.auth) @@ -155,6 +160,12 @@ var/bomb_set set name = "Make Deployable" set src in oview(1) + if (!usr.canmove || usr.stat || usr.restrained()) + return + if (!ishuman(usr)) + usr << "\red You don't have the dexterity to do this!" + return 1 + if (src.deployable) usr << "\red You close several panels to make [src] undeployable." src.deployable = 0 From f26f64efad6645e8561c0fa1ac1d2df961dacacf Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 22 Nov 2013 23:47:23 +1030 Subject: [PATCH 28/38] Fixes #3643 --- code/game/mecha/equipment/tools/tools.dm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index fd34b65baa0..73c7f5bd84f 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -439,8 +439,18 @@ var/atom/movable/locked var/mode = 1 //1 - gravsling 2 - gravpush + var/last_fired = 0 //Concept stolen from guns. + var/fire_delay = 10 //Used to prevent spam-brute against humans. action(atom/movable/target) + + if(world.time >= last_fired + fire_delay) + last_fired = world.time + else + if (world.time % 3) + occupant_message("[src] is not ready to fire again!") + return 0 + switch(mode) if(1) if(!action_checks(target) && !locked) return From 930515756fce26f85302295bdb9c33047b6e37bd Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 23 Nov 2013 01:23:42 +1030 Subject: [PATCH 29/38] Fixes #3661 --- icons/obj/ammo.dmi | Bin 4377 -> 4393 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 86d6829d138918009a86b1aea4993a634fa05240..95f8db0ee1e8a9d28f60bb352f314fc90294e457 100644 GIT binary patch delta 3618 zcmZ8kc|6qH`=8A+mJA{xGf8qOONhdZtx^ezwC2=Q;29d7anuJn8C%>PZ^Vh?jeV zp}P&QLLhC1kaP${XqYb>c^v|QKyRLPI0vzu=-*O7>tDTqW$vCxj7aU|#d}$Zk(M+hY3jcdP(!8r@KMMkpPB~#~&|1M;FE@tWa*b>^J7!ilaB-HX&Vf^3 z8gYKG3wIQDp%7NURx8juExt6tW5d(_{Ex}!Kp;dk=QpMiebZaoq)A0gylZ=)+Ncx< zc8;A0>pjs(Hv$oj%MT$f9HeLX`6USy=8hpqDdbu&tG-CVmg6)1? z>#R(#qUe*0OY|V?&ft_=Cf z%w}OjCZts5rX3B8{hngnNZMFqDBk}8qTu~bpZ@^KdIh32uoadY#MjkUsQUV0Fjn=} zhDQeqdP~;JUiu((V=3m9P7a`Z_^La4n^^;WJPuU%PZ}hDnY}D>!BVJN{!ketkZa)k zb40%#P?9cB64Z>R1rd!HckhO!L+aA1%B*fky6E9tNT=)}A{+SF@UR$crSa5c>NUwj zGXSN>gu#k3V({I{q7=VqETu_ET}xUU@KWARyGTmuO8oFc9`D;m z(t82nisn1qpZ&(Q&eNgGO=WprdNjhr*~nr{NaV#KC_n|R2Uy!qukUPTnXrEH5jy7KihhbR00KSmtg~joRmLOFq{%kZMyUrBz^GfJo9Vi3H^<;MMkd@AfZJPyXk-^Zl zKJc2djwN~3LNsptl>XKYP6#w$?h9oQKjc>&U7zvT9w0X)%fQWVPB|^_+ezzsZO5+i zreGLXG#Q?Utggy?F4*LEe}gZnY0-}{5g!)5s*0qoMjFxet@zE>N#0jY?1tr}V7-li zsr+bGKiR_BT7|i%tS=tc79}iK8}-zp$EJ49G%E*%rErvqTH>fCltm5MmH#PBjd;zce?V*OQ zJFbKH;^Aoc0w5VxH_VC(7H8$|u9k^S^0Y851Jv@O@i!LVH1kZe8HX3RK?`hz+cO7A zHlPxIJ$}B&#*(T;=HbP^Z|<&em9Z(4z~j}tQIUa0Gn={M_0)Lta9yvkGMIXqvFU=> zC#(GK*(F5l7VgM0SoXOeO)=>*@ZJdAL1@lToVldGu_~CE0e$qHh|f4mTURhB$9A-4OQr zmhNoFUu6?oBi`W1T5bM9+Op@r;R&B4+3PzHv?C&vD}w(HXK|3%!7+EP2yNNT!{ex2 z1)CBwyu)gd2i&$JS8fKCf|r)v>PVV?gDR|AJq^0Fy49e-w2wHA9H?(qQ^xc&k>oxN3Tm{F|Qn2lTIEwq)4!@oXzH4Nnu>^t)vh^bfwTM`W zmqKxK6-o_s5a8H-prMHqDHS#^BfJGvbGV?Lr3+JLDkJdCUbse7`CGMD*5$bNAvbg2 zo#d#Q9$X!xf_Cobj`S$RgUTAFL*Y}tBr%_{+Y;cDLd&5(4C8w{97ihaBn8xmiquj^ z@ssFx&&mo(0sOUHd9a=668bRW9Yny}waW>+AZB|W1B{I+m}bz>bhsvM=uN!DO>>48 zDbC)qhF@9RNz-xSwcz-cVpBKC{tHbApRr96U!v}w*!uYNxwd?lQGfF8)}fLp=a{er zNP~oJRD{UPj9TMj-^N%oSFyuOk$JS#D@GfwPiLPIQOAl-0U;k#MTxi+uB@dn;~bM1 z&#Fa*&b$z0v)h<|8Mb7n430HwS3A8Q-0Nh7AvMf$*v`|8DKs8Fw zk|;7Q;=qiPET5uqHqA0Jfak#S_@B&4^Z_5HP)6(Fd(Av>{#7us0&;KuIqmIY*nFaS zUnHx~t6uh6l|YtSN@Wr2A@>B;w6|H^3eDlAT#a2$feG96m+c^Tc?9Sc*R)WPh?dbQ z)B5LP@$0_8DuPKXt&kEIJ<03 zz1pnqOamG5liDa;;!Do-gtBK%=oN^x z>13{GmPmIV^Pl)mFsCC7a1gC%uTWtx;%o@w;(RA)qedY2e%Kb@n2s>5moc2!pq64a6RLnWV>;{ e;-$VcA8oT$Ry`j4AhlKaK~5ZXur0OrCjTG7i4D8} delta 3577 zcmZ8kcTm&W7EVGa31SeW$SMH~D2m`xMMx14Py|#IU0M_uSOt;*N(93%z=9|b6Ga7A z)F8TmD@8?m35W)iCS6Jrihw{8nh7E8;rjNynKyI(xcAQa&dm4Sx#v5#VC(&@wC&)C zmpdZCTKi3M_kutmaP)DH6CljwK=9hS>U9P95qRejdpvRFi_W!eFKsvXy&K(Z$_sAn z|0FA2Lb{@f9)u-rNfZ_YQp?DoDCh%WF19p6a#PChDSbOGIJ)lQSi2mdr0BN;?9cw( z{d`^S+=Y-r;q_L;)%RVkndNx_PY*e&L$T`6oH|RxrUz3oD!8IuEX(@0ZTnOIBz1!j zNmj!f@tX~tPSjkXM7656mfFC*jHQs*bDEM5E|Bb2V-ok$yNei#diz|`a{qa7osQu7|PwKao85#`N? z1G%lQY+PykZ*)}Ye3$D#u```_E~aH$aq$h_!g#~O8lZesbeEe;OiMd|FuV9hgz#a^ zd*N+%@}y50RrxUG6!^JX^sPbH{YYYB>5i2qBc;~jxEep?Xm92!R+$rTcrISnbp2)- zqXIuUf3{g}JvQOiT(9%8X5E#@_=4444NL{5rmoBI?EN@nNYiAd8a)*0iMg96A4g0V zhJwdXfGB=lDPzJ{Mnm5REq;W}gI+b3ulF|?Qp**F;vqq!35cR>?mL=k&a zwisa;c@XGT6AZ(*4ast9b6A8hj9OQ+3XsX<#dhTS=3%B8&4kD?Xk2;T;s6jdA2RX+ z3>TZ%?FzIiTXG@KSkg|{`#kP>rZn}}d*HGx%QNEb@~YIhWd3B(0iY>Q;b~uof5E1J zmXj%5$v!-3$5i@x0U^6sZ%EWnmL?jg{1dv7Gv2)x`8M3khG4Cly#HtaVmlbJn z`Fd~+T#`jM(^u+N%nN{Y%I=VT`eH%pYlHFt@g;m zqeN%onsP2iBchCc`rcCKa%`PN=m%vTjIjgv$Ta- zu2jt9tn1t^Fn&c5iCtSZsO`~`OKBJi6R zB^Z3_kd0BMC*$Ehg}M@my>9jai-Hig>it5{5qeyF_)$pd*+O<;hGY*76n@6{uUMrY zw+JM*H<|h$ywS@#Qb= zLBg&0+C8ggoeyFO{~RW(N^m>!7)y0}m%Ww=&XYdX#%Oslqx<`;XfPj)=?| zLCl*wfZJd_|FoWXRe_3z->({TziOVh9!*C@n>=(-M^YeR6Gv&1h&CeS41iffHsSX` zVZoP^dQ2M(FjDa~3oxLcYC7P!qx7r8Vr=?OMyn7p3)cS~5=MflS@&PB{wuqGI!TK} zQ1FI*5)lI4R{t^7%u}!_1$~v3+kImaA8*>X5OP>|>ni;*P7U-wn>1N=s$^BRo4&HzBNtF$r0i!jyt!1 zWA=_9GBX>(qeG`h;XXOmV=x-t?fV%v{wNi2DNBYFnDhwwooGV6$;FX?TxVDtO9*gqm(F+1 zJEngm9(;R*#UE!4!OH9&Y7fe-1^;g_YyJ|T#hL$^VJ={W_K00JkkA{hEc(^)0u-GB zE)oD%{k=5~_y;gT7}QyVyHb`2M8Zb8wB8ZTmzR_SDpaXAn{jvNo7{$zuyjr}&0cOQx# zV#&g${$RE}=-09_cKf>`pD6At9EyoBUXd)B-IlEi1nmNkf88M5hBCvWT9&*D(R(fa zv3))whdk{2F7BO93~%@(;vIiu3_p1B;#?RWD9}d<>uO^7EPgRR%UE~0{>_jn@aj8O zu%O;Uz2?P2Hm-OBNbV&Wt))YKPXkf@pbuixb2V0FTGP=Sx!$k_{kxz*hU!uPPkulg z{lV6NkXR-q7KytwOS#mjk<3Rwq`3oa07ZQlFU`|jEK2%2rBSm71^hsnGo}!cA>d1Z zP|;#x3IYGe)4U;{ks+M$$82)!Y2iJ@j|~8ydq1(@B==4FO0}3T>p&}BmgiRha+wc& zr{Q3R6u*9DSIO)%&50za>&m=1=A~Arlo-sK6e%1+Wy`xC*URjvK47xdBv`|MClyPY z;9q67j`#%$I2XX{->f62=7mnxQY2e8Z!q9pyv3O|qaFgtma&ovLk-$pp+fBH@~%w= zJmzk{kW(rG=BBu`DWNXcK~Kv46w2pQX_OZ=$j%rx*;C1N1()m)oQwmqE6Yi;6deX4 zK*=)dEsi zmf=0U4)LSK-GV(ELP>^xAs;sJn0^^UG=|SbM|`n>@-N{^?4Qu&KD7 zw5=~fx((%zekUe@wWUOCaxH!Lzn1*?ZgzAQd<$;k76^bZEkHgLna{$PZ#H})lAICh z3k5-;FjgSNEk@%c)|pfWiBf77HA0@6oY#wgMW!zpwTjMJkN)PJbxCpZKq{dwD@mnW zZmrdE(jZk%IIOvk;+%KEzdT8 z$9OISQ_j0{;Q96)Z1)mAb@vd}XKaSM=YR9^_rW=sx)@l9Mu6IFVz=)C$g5AJ6zmn-oj*yA9r5> zr@>X5+ZzdCS&9Jk4SAV@|c>XMU2C{ z?=QE|TnNio~bAmUS(J79mm d|5k`xxp4fD8 Date: Fri, 22 Nov 2013 12:52:25 -0600 Subject: [PATCH 30/38] Bugfix: is_loyalty_implanted() now checks to make sure the implant is actually implanted and now in your hand. implant adding via the traitor panel will also update it's location to be in the players head for autopsy as well as is_loyalty_implanted() reasons. Thanks Chinsky / alex-gh for the heads up on this. --- code/datums/mind.dm | 13 +++++++++++-- code/modules/mob/living/carbon/human/human.dm | 4 +++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 7d25f4da650..6d57a6808de 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -497,10 +497,19 @@ datum/mind switch(href_list["implant"]) if("remove") for(var/obj/item/weapon/implant/loyalty/I in H.contents) - I.Del() + for(var/datum/organ/external/organs in H.organs) + if(I in organs.implants) + I.Del() + break H << "\blue Your loyalty implant has been deactivated." if("add") - H.contents.Add( new /obj/item/weapon/implant/loyalty (src) ) + var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) + L.imp_in = H + L.implanted = 1 + var/datum/organ/external/affected = H.organs_by_name["head"] + affected.implants += L + L.part = affected + H << "\red You somehow have become the recepient of a loyalty transplant, and it just activated!" if(src in ticker.mode.revolutionaries) special_role = null diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5b8b01eab50..74cab645053 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -299,7 +299,9 @@ /mob/living/carbon/human/proc/is_loyalty_implanted(mob/living/carbon/human/M) for(var/L in M.contents) if(istype(L, /obj/item/weapon/implant/loyalty)) - return 1 + for(var/datum/organ/external/O in M.organs) + if(L in O.implants) + return 1 return 0 /mob/living/carbon/human/attack_slime(mob/living/carbon/slime/M as mob) From bcbf02e8096451b05de6d9539dcc9c9906943dc4 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Fri, 22 Nov 2013 18:36:20 -0600 Subject: [PATCH 31/38] Changed admin message to use the proc that formats for easy Admin-PM of the baddie. Thanks Kilakk for pointing it out. --- code/game/objects/items/devices/PDA/PDA.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 29db96bdf2c..9123617f2a7 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -715,12 +715,12 @@ var/global/list/obj/item/device/pda/PDAs = list() U.show_message("\red Energy feeds back into your [src]!", 1) U << browse(null, "window=pda") explode() - log_admin("[U] ([U.key]) just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up") - message_admins("[U] ([U.key]) just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up", 1) + log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up") + message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up", 1) else U.show_message("\blue Success!", 1) - log_admin("[U] ([U.key]) just attempted to blow up [P] with the Detomatix cartridge and succeded") - message_admins("[U] ([U.key]) just attempted to blow up [P] with the Detomatix cartridge and succeded", 1) + log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge and succeded") + message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge and succeded", 1) P.explode() else U << "PDA not found." From 5fb242afc856ec89529c5967440eb5f2e269b209 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Fri, 22 Nov 2013 19:00:18 -0600 Subject: [PATCH 32/38] Bugfix: Atmospherics technicians will now have external_airlock access We gave them suits, we never gave them access. Cleared this already with Raven --- code/game/jobs/job/engineering.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 246d3eb3f01..8677f99728e 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -85,8 +85,8 @@ spawn_positions = 2 supervisors = "the chief engineer" selection_color = "#fff5cc" - access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics) - minimal_access = list(access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction) + access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_external_airlocks) + minimal_access = list(access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks) equip(var/mob/living/carbon/human/H) @@ -104,4 +104,4 @@ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack) - return 1 \ No newline at end of file + return 1 From 7cc1c93207fdf2e717dc8588164f556c13e2248e Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 23 Nov 2013 13:47:20 +1030 Subject: [PATCH 33/38] Clamps pill numbers between 1 and 20. --- code/modules/reagents/Chemistry-Machinery.dm | 41 +++++++++++++------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 8b5400fa40e..2ebf1d25900 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -204,6 +204,8 @@ var/bottlesprite = "1" //yes, strings var/pillsprite = "1" var/client/has_sprites = list() + var/waiting = null //Fix for spamming 'create multiple pills' + var/max_pill_count = 20 /obj/machinery/chem_master/New() var/datum/reagents/R = new/datum/reagents(100) @@ -348,23 +350,32 @@ icon_state = "mixer0" else if (href_list["createpill"] || href_list["createpill_multiple"]) var/count = 1 - if (href_list["createpill_multiple"]) count = isgoodnumber(input("Select the number of pills to make.", 10, pillamount) as num) - if (count > 20) count = 20 //Pevent people from creating huge stacks of pills easily. Maybe move the number to defines? + if (href_list["createpill_multiple"] && !waiting) + waiting = 1 + count = Clamp(isgoodnumber(input("Select the number of pills to make.", 10, pillamount) as num),1,max_pill_count) + var/amount_per_pill = reagents.total_volume/count if (amount_per_pill > 50) amount_per_pill = 50 - var/name = reject_bad_text(input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill] units)")) - while (count--) - var/obj/item/weapon/reagent_containers/pill/P = new/obj/item/weapon/reagent_containers/pill(src.loc) - if(!name) name = "[reagents.get_master_reagent_name()] ([amount_per_pill] units)" - P.name = "[name] pill" - P.pixel_x = rand(-7, 7) //random position - P.pixel_y = rand(-7, 7) - P.icon_state = "pill"+pillsprite - reagents.trans_to(P,amount_per_pill) - if(src.loaded_pill_bottle) - if(loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots) - P.loc = loaded_pill_bottle - src.updateUsrDialog() + + if(waiting < 2) + var/name = reject_bad_text(input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill] units)")) + waiting = 2 + while (count--) + var/obj/item/weapon/reagent_containers/pill/P = new/obj/item/weapon/reagent_containers/pill(src.loc) + if(!name) name = "[reagents.get_master_reagent_name()] ([amount_per_pill] units)" + P.name = "[name] pill" + P.pixel_x = rand(-7, 7) //random position + P.pixel_y = rand(-7, 7) + P.icon_state = "pill"+pillsprite + reagents.trans_to(P,amount_per_pill) + if(src.loaded_pill_bottle) + if(loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots) + P.loc = loaded_pill_bottle + src.updateUsrDialog() + + spawn(0) + waiting = null + else if (href_list["createbottle"]) if(!condi) var/name = reject_bad_text(input(usr,"Name:","Name your bottle!","[reagents.get_master_reagent_name()] ([reagents.total_volume] units)")) From abd17deb5b9870b417a1a420bd26fc8f353c8372 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 23 Nov 2013 14:02:10 +1030 Subject: [PATCH 34/38] Fixes #3962 --- code/modules/reagents/Chemistry-Machinery.dm | 44 +++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 2ebf1d25900..854cacb7dfa 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -204,7 +204,6 @@ var/bottlesprite = "1" //yes, strings var/pillsprite = "1" var/client/has_sprites = list() - var/waiting = null //Fix for spamming 'create multiple pills' var/max_pill_count = 20 /obj/machinery/chem_master/New() @@ -349,32 +348,37 @@ reagents.clear_reagents() icon_state = "mixer0" else if (href_list["createpill"] || href_list["createpill_multiple"]) + var/count = 1 - if (href_list["createpill_multiple"] && !waiting) - waiting = 1 + + if(reagents.total_volume/count < 1) //Sanity checking. + return + + if (href_list["createpill_multiple"]) count = Clamp(isgoodnumber(input("Select the number of pills to make.", 10, pillamount) as num),1,max_pill_count) + if(reagents.total_volume/count < 1) //Sanity checking. + return + var/amount_per_pill = reagents.total_volume/count if (amount_per_pill > 50) amount_per_pill = 50 + var/name = reject_bad_text(input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill] units)")) - if(waiting < 2) - var/name = reject_bad_text(input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill] units)")) - waiting = 2 - while (count--) - var/obj/item/weapon/reagent_containers/pill/P = new/obj/item/weapon/reagent_containers/pill(src.loc) - if(!name) name = "[reagents.get_master_reagent_name()] ([amount_per_pill] units)" - P.name = "[name] pill" - P.pixel_x = rand(-7, 7) //random position - P.pixel_y = rand(-7, 7) - P.icon_state = "pill"+pillsprite - reagents.trans_to(P,amount_per_pill) - if(src.loaded_pill_bottle) - if(loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots) - P.loc = loaded_pill_bottle - src.updateUsrDialog() + if(reagents.total_volume/count < 1) //Sanity checking. + return - spawn(0) - waiting = null + while (count--) + var/obj/item/weapon/reagent_containers/pill/P = new/obj/item/weapon/reagent_containers/pill(src.loc) + if(!name) name = "[reagents.get_master_reagent_name()] ([amount_per_pill] units)" + P.name = "[name] pill" + P.pixel_x = rand(-7, 7) //random position + P.pixel_y = rand(-7, 7) + P.icon_state = "pill"+pillsprite + reagents.trans_to(P,amount_per_pill) + if(src.loaded_pill_bottle) + if(loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots) + P.loc = loaded_pill_bottle + src.updateUsrDialog() else if (href_list["createbottle"]) if(!condi) From bfc5a61da15f717ae4e911c3fa601d81bb41db8d Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 23 Nov 2013 20:33:58 +1030 Subject: [PATCH 35/38] Fixes #3966 --- code/game/objects/items/weapons/implants/implant.dm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 38150b5a8d2..20148aab7b5 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -157,14 +157,20 @@ Implant Specifics:
"} activate() if (malfunction == MALFUNCTION_PERMANENT) return + + var/need_gib = null if(istype(imp_in, /mob/)) var/mob/T = imp_in message_admins("Explosive implant triggered in [T] ([T.key]). (JMP) ") log_game("Explosive implant triggered in [T] ([T.key]).") + need_gib = 1 - T.gib() explosion(get_turf(imp_in), 1, 3, 4, 6, 3) + + if(need_gib) + imp_in.gib() + var/turf/t = get_turf(imp_in) if(t) From b476a55b47ba5aa291b4b93758374a0eb46fa02a Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 23 Nov 2013 20:52:39 +1030 Subject: [PATCH 36/38] Fixes #3967 --- code/game/gamemodes/events/power_failure.dm | 9 ++++++--- code/modules/power/smes.dm | 5 ++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/code/game/gamemodes/events/power_failure.dm b/code/game/gamemodes/events/power_failure.dm index 19c009356b7..c8848cd3ee8 100644 --- a/code/game/gamemodes/events/power_failure.dm +++ b/code/game/gamemodes/events/power_failure.dm @@ -7,6 +7,9 @@ for(var/obj/machinery/power/smes/S in world) if(istype(get_area(S), /area/turret_protected) || S.z != 1) continue + S.last_charge = S.charge + S.last_output = S.output + S.last_online = S.online S.charge = 0 S.output = 0 S.online = 0 @@ -60,9 +63,9 @@ for(var/obj/machinery/power/smes/S in world) if(S.z != 1) continue - S.charge = S.capacity - S.output = 200000 - S.online = 1 + S.charge = S.last_charge + S.output = S.last_output + S.online = S.last_online S.updateicon() S.power_change() for(var/area/A in world) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index ecc7acb8173..a5e0f52d726 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -23,7 +23,10 @@ var/online = 1 var/n_tag = null var/obj/machinery/power/terminal/terminal = null - + //Holders for powerout event. + var/last_output = 0 + var/last_charge = 0 + var/last_online = 0 /obj/machinery/power/smes/New() ..() From 471c45471e059a57d699428d16cf202273471cbc Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 23 Nov 2013 21:08:52 +1030 Subject: [PATCH 37/38] Fixes #3927 --- code/modules/mob/living/simple_animal/simple_animal.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 73eb427c366..350471f1b37 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -262,7 +262,7 @@ grabbed_by += G G.synch() - + G.affecting = src LAssailant = M for(var/mob/O in viewers(src, null)) @@ -298,6 +298,7 @@ grabbed_by += G G.synch() + G.affecting = src LAssailant = M playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) From 185c83b287d387734fdeeea454632642201bfc45 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sun, 24 Nov 2013 09:22:50 +1030 Subject: [PATCH 38/38] Fixes #3642 --- code/game/objects/structures/stool_bed_chair_nest/chairs.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 6aa93d8b3b6..a94a2f8cfdd 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -55,6 +55,8 @@ handle_rotation() return else + if(istype(usr,/mob/living/simple_animal/mouse)) + return if(!usr || !isturf(usr.loc)) return if(usr.stat || usr.restrained())