From a90173c6283c0151b3310f3798c6fea5189f7e3c Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Fri, 30 Mar 2012 20:31:26 -0700 Subject: [PATCH 1/4] Part one of bugfixes for the new damage system. --- .../Cael_Aislinn/Tajara/tajaran.dm | 8 +- .../Cael_Aislinn/Tajara/tajaran.dmi | Bin 18500 -> 19238 bytes code/defines/procs/helpers.dm | 2 +- code/game/gamemodes/newobjective.dm | 216 ++++++++++++++---- code/game/objects/items/weapons/medical.dm | 25 +- code/modules/chemical/Chemistry-Tools.dm | 1 + code/modules/mob/living/carbon/give.dm | 6 +- .../mob/living/carbon/human/examine.dm | 12 +- code/modules/mob/living/carbon/human/human.dm | 1 - code/modules/mob/living/carbon/human/life.dm | 4 +- .../mob/living/carbon/monkey/monkey.dm | 11 + code/modules/mob/mob_defines.dm | 1 + code/modules/mob/organ/organ.dm | 65 +++--- 13 files changed, 260 insertions(+), 92 deletions(-) diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm index 3ac7e6364e1..15426fda49c 100644 --- a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm +++ b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm @@ -329,8 +329,10 @@ overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) head.screen_loc = ui_head else + var/datum/organ/external/head = organs["head"] + if(!head.destroyed) //if not wearing anything on the head, show the ears - overlays += image("icon" = icon('tajaran.dmi', "ears_[gender==FEMALE ? "f" : "m"]_[lying ? "l" : "s"]"), "layer" = MOB_LAYER) + overlays += image("icon" = icon('tajaran.dmi', "ears_[gender==FEMALE ? "f" : "m"]_[lying ? "l" : "s"]"), "layer" = MOB_LAYER) // Belt if (belt) @@ -474,8 +476,8 @@ else if (gender == FEMALE) g = "f" - stand_icon = new /icon('tajaran.dmi', "torso_s") - lying_icon = new /icon('tajaran.dmi', "torso_l") + stand_icon = new /icon('tajaran.dmi', "torso_[g]_s") + lying_icon = new /icon('tajaran.dmi', "torso_[g]_l") var/husk = (mutations & HUSK) //var/obese = (mutations & FAT) diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dmi b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dmi index 79333e346bb6e577bf4d6fc211fdf5ed55c939a3..05b198970dc24606e9ae067b112353e20ce423d2 100644 GIT binary patch literal 19238 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 Y18rn=+zsBtvH$=807*qoM6N<$f^U!8E&u=k literal 18500 zcmcG$byQVvw>G>9L8L)aI+c`?4sj!0(v39IU7HZ;?hXY6X{8&Hl9uj}ZrF75-Ta>C zobUU_d(If|JH~ncV6*pPuXV?o^P1PZ=3Im-DM(^IA$cCxLqIw;FVMU_ya#8-964yuC8rTJu1kDy_ zE~b&`)>-#?B^9{MQ`XxujVVxeR~MeQE?mb42Zo1Cy5Zv{FV>6_UogaN6m(jeEO?n7Nk>ZqKiYW5LYor&c&3{W$s7!F>gS%SWNH*rq6m(xAA@^^ z^vnq$jqQWCVAV zWNd`|tleX|BeCs-JK_W%7v3Q{AG>;mEnCGyAXE@(=xbH?jJMWi+D*R(Y523wIliBg1JpwnB3VD= zpYu+KNB0AUQY>OZsEvKcyB^betYlc9LPDf!1jZjx(d5i@AVZ;0nXzIvv9H_v`#yR% zKC8cD8`Y8mL%!j0AS4FMH^q zP*r4x&m+x-m(ozEgdrl+uM@r@-s7el`P3D$J0&UJ`-CmV{1p91@J9rT^P~nYBq2;B z_)4)ybkv1CjC@nMi?EAy&GX#yEoRCF{I)iV!o;P;`$f!)i!rOK21;-FR<+kRONP

EYVNTS`XZWTI$Kzd~qmzi5Ob%$snI? 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 3) + if(W.wound_size > 3 && (W.bleeding || !W.is_healing)) + if(stoppedblood) + stoppedblood += 1 + break W.bleeding = 0 - else + W.is_healing = 1 + stoppedblood = 1 + else if(W.wound_size <= 3) + if(stoppedblood) + stoppedblood += 1 + break W.stopbleeding() - stoppedblood = 1 + stoppedblood = 1 if (user && stoppedblood) if (M != user) - H.visible_message("\red You bandage up [stoppedblood - 1 ? "some of" : "the last of"] [H]'s cuts", "\red [user] bandages [stoppedblood - 1 ? "some of" : "the last of"] [H]'s cuts with [src]", "\red You hear something like gauze being ripped.") + user.visible_message("\red [user] bandages [stoppedblood - 1 ? "some of" : "the last of"] [H]'s cuts with [src]", "\red You bandage up [stoppedblood - 1 ? "some of" : "the last of"] [H]'s cuts", "\red You hear something like gauze being ripped.") else - H.visible_message("\red You bandage up [stoppedblood - 1 ? "some of" : "the last of"] your cuts", "\red [user] bandages [stoppedblood - 1 ? "some of" : "the last of"] their own cuts with [src]", "\red You hear something like gauze being ripped.") + user.visible_message("\red [user] bandages [stoppedblood - 1 ? "some of" : "the last of"] [user.gender == MALE? "his" : "her"] own cuts with [src]", "\red You bandage up [stoppedblood - 1 ? "some of" : "the last of"] your cuts", "\red You hear something like gauze being ripped.") else if(user) user << "\red Nothing to patch up!" return diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm index d8414436ff4..acc4fb665a7 100644 --- a/code/modules/chemical/Chemistry-Tools.dm +++ b/code/modules/chemical/Chemistry-Tools.dm @@ -972,6 +972,7 @@ if(T:vessel.get_reagent_amount("blood") < amount) return T:vessel.trans_to(src, amount) + on_reagent_change() else var/datum/reagent/B = new /datum/reagent/blood B.holder = src diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 3a4f2367a7f..167ad789fda 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -21,7 +21,7 @@ mob/living/carbon/verb/give() if(!I) return if(src.r_hand == null) - switch(alert(src,"[usr.name] wants to give you \a [I.name]?",,"Yes","No")) + switch(alert(src,"[usr] wants to give you \a [I]?",,"Yes","No")) if("Yes") if(!check_can_reach(usr,src)) usr << "You need to keep in reaching distance." @@ -50,7 +50,7 @@ mob/living/carbon/verb/give() if("No") src.visible_message("[usr.name] tried to hand [I.name] to [src.name] but [src.name] didn't want it.") else if(src.l_hand == null) - switch(alert(src,"[src.name] wants to give you \a [I.name]?",,"Yes","No")) + switch(alert(src,"[usr] wants to give you \a [I]?",,"Yes","No")) if("Yes") if(!check_can_reach(usr,src)) usr << "You need to keep in reaching distance." @@ -79,4 +79,4 @@ mob/living/carbon/verb/give() if("No") src.visible_message("[usr.name] tried to hand [I.name] to [src.name] but [src.name] didn't want it.") else - usr << "[src.name]\s hands are full." \ No newline at end of file + usr << "[src.name]'s hands are full." \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index cc75597ada4..627ec60cd0a 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -436,29 +436,39 @@ if(wound_flavor_text["chest"] && !w_uniform && !skipjumpsuit) msg += wound_flavor_text["chest"] else if(is_bleeding["chest"]) - msg += "[src] has blood from under [t_his] clothing!\n" + msg += "[src] has blood soaking through from under [t_his] clothing!\n" if(wound_flavor_text["left arm"] && !w_uniform && !skipjumpsuit) msg += wound_flavor_text["left arm"] + else if(is_bleeding["left arm"]) + msg += "[src] has blood soaking through from under [t_his] clothing!\n" if(wound_flavor_text["left hand"] && !gloves && !skipgloves) msg += wound_flavor_text["left hand"] else if(is_bleeding["left hand"]) msg += "[src] has blood running from under [t_his] gloves!\n" if(wound_flavor_text["right arm"] && !w_uniform && !skipjumpsuit) msg += wound_flavor_text["right arm"] + else if(is_bleeding["right arm"]) + msg += "[src] has blood soaking through from under [t_his] clothing!\n" if(wound_flavor_text["right hand"] && !gloves && !skipgloves) msg += wound_flavor_text["right hand"] else if(is_bleeding["right hand"]) msg += "[src] has blood running from under [t_his] gloves!\n" if(wound_flavor_text["groin"] && !w_uniform && !skipjumpsuit) msg += wound_flavor_text["groin"] + else if(is_bleeding["groin"]) + msg += "[src] has blood soaking through from under [t_his] clothing!\n" if(wound_flavor_text["left leg"] && !w_uniform && !skipjumpsuit) msg += wound_flavor_text["left leg"] + else if(is_bleeding["left leg"]) + msg += "[src] has blood soaking through from under [t_his] clothing!\n" if(wound_flavor_text["left foot"]&& !shoes && !skipshoes) msg += wound_flavor_text["left foot"] else if(is_bleeding["left foot"]) msg += "[src] has blood running from [t_his] shoes!\n" if(wound_flavor_text["right leg"] && !w_uniform && !skipjumpsuit) msg += wound_flavor_text["right leg"] + else if(is_bleeding["right leg"]) + msg += "[src] has blood soaking through from under [t_his] clothing!\n" if(wound_flavor_text["right foot"]&& !shoes && !skipshoes) msg += wound_flavor_text["right foot"] else if(is_bleeding["right foot"]) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b1116d78ff6..7eff4a056f6 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -54,7 +54,6 @@ var/list/body_standing = list() var/list/body_lying = list() - var/organs2 = list() var/mutantrace = null diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index c9b2b87aa2b..d93cd88af4d 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -857,7 +857,7 @@ leg_tally-- // let it fail even if just foot&leg // can't stand - if(leg_tally == 0) + if(leg_tally == 0 && !paralysis) emote("scream") emote("collapse") paralysis = 10 @@ -1470,4 +1470,4 @@ snippets plcheck = t_plasma oxcheck = t_oxygen G.turf_add(T, G.total_moles()) -*/ +*/ diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 6480701a8d0..715eaeeb6c2 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -24,26 +24,37 @@ real_name = name var/datum/organ/external/chest/chest = new /datum/organ/external/chest( src ) chest.owner = src + organs2 += chest var/datum/organ/external/groin/groin = new /datum/organ/external/groin( src ) groin.owner = src + organs2 += groin var/datum/organ/external/head/head = new /datum/organ/external/head( src ) head.owner = src + organs2 += head var/datum/organ/external/l_arm/l_arm = new /datum/organ/external/l_arm( src ) l_arm.owner = src + organs2 += l_arm var/datum/organ/external/r_arm/r_arm = new /datum/organ/external/r_arm( src ) r_arm.owner = src + organs2 += r_arm var/datum/organ/external/l_hand/l_hand = new /datum/organ/external/l_hand( src ) l_hand.owner = src + organs2 += l_hand var/datum/organ/external/r_hand/r_hand = new /datum/organ/external/r_hand( src ) r_hand.owner = src + organs2 += r_hand var/datum/organ/external/l_leg/l_leg = new /datum/organ/external/l_leg( src ) l_leg.owner = src + organs2 += l_leg var/datum/organ/external/r_leg/r_leg = new /datum/organ/external/r_leg( src ) r_leg.owner = src + organs2 += r_leg var/datum/organ/external/l_foot/l_foot = new /datum/organ/external/l_foot( src ) l_foot.owner = src + organs2 += l_foot var/datum/organ/external/r_foot/r_foot = new /datum/organ/external/r_foot( src ) r_foot.owner = src + organs2 += r_foot organs["chest"] = chest organs["groin"] = groin diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 8abee2c7478..aa2017253d6 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -280,6 +280,7 @@ the mob is also allowed to move without any sort of restriction. For instance, i // var/obj/effect/organstructure/organStructure = null //for dem organs var/list/organs = list( ) //List of organs. + var/list/organs2 = list() //Singularity wants you! var/grav_delay = 0 diff --git a/code/modules/mob/organ/organ.dm b/code/modules/mob/organ/organ.dm index 5e4977c652f..6fb0e1c62d8 100644 --- a/code/modules/mob/organ/organ.dm +++ b/code/modules/mob/organ/organ.dm @@ -99,7 +99,7 @@ if(prob(brute) && brute > 20 && !sharp) createwound(rand(4,6),0,brute) else if(!sharp) - createwound(max(1,min(6,round(brute/10) + rand(-1,1))),1,brute) + createwound(max(1,min(6,round(brute/10) + rand(0,2))),1,brute) if(burn) burn_dam += burn createwound(max(1,min(6,round(burn/10) + rand(-1,1))),2,burn) @@ -152,15 +152,16 @@ brute -= W.damage W.damage = 0 W.initial_dmg = 0 - W.stopbleeding() + W.stopbleeding(1) else W.damage -= brute W.initial_dmg -= brute + W.stopbleeding() else if(brute) for(var/datum/organ/wound/W in brute_wounds) W.damage = 0 W.initial_dmg = 0 - W.stopbleeding() + W.stopbleeding(1) brute_dam = 0 if(burn && burn >= burn_to_heal) for(var/datum/organ/wound/W in burn_wounds) @@ -173,6 +174,7 @@ else W.damage -= burn W.initial_dmg -= burn + W.stopbleeding() else if(burn) for(var/datum/organ/wound/W in burn_wounds) W.damage = 0 @@ -226,8 +228,6 @@ return if(brute_dam > min_broken_damage) if(broken == 0) - var/dmgmsg = "[damage_msg] in your [display_name]" - owner << dmgmsg //owner.unlock_medal("Broke Yarrr Bones!", 0, "Break a bone.", "easy") owner.visible_message("\red You hear a loud cracking sound coming from [owner.name].","\red Something feels like it shattered in your [display_name]!","You hear a sickening crack.") owner.emote("scream") @@ -275,6 +275,8 @@ proc/droplimb() if(destroyed) //owner.unlock_medal("Lost something?", 0, "Lose a limb.", "easy") + + owner.visible_message("\red [owner.name]'s [display_name] flies off in an arc.","\red Your [display_name] goes flying off!","You hear a terrible sound of ripping tendons and flesh.") switch(body_part) if(UPPER_TORSO) owner.gib() @@ -288,6 +290,7 @@ H.transfer_identity(owner) H.pixel_x = -10 H.pixel_y = 6 + H.name = "[owner.name]'s head" var/lol = pick(cardinal) step(H,lol) @@ -332,29 +335,21 @@ destroyed = 1 if(HAND_RIGHT) var/obj/item/weapon/organ/r_hand/X = new(owner.loc, owner) - for(var/mob/M in viewers(owner)) - M.show_message("\red [owner.name]'s [X.name] flies off in an arc.") var/lol2 = pick(cardinal) step(X,lol2) destroyed = 1 if(HAND_LEFT) var/obj/item/weapon/organ/l_hand/X = new(owner.loc, owner) - for(var/mob/M in viewers(owner)) - M.show_message("\red [owner.name]'s [X.name] flies off in an arc.") var/lol2 = pick(cardinal) step(X,lol2) destroyed = 1 if(FOOT_RIGHT) var/obj/item/weapon/organ/r_foot/X = new(owner.loc, owner) - for(var/mob/M in viewers(owner)) - M.show_message("\red [owner.name]'s [X.name] flies off in an arc.") var/lol2 = pick(cardinal) step(X,lol2) destroyed = 1 if(FOOT_LEFT) var/obj/item/weapon/organ/l_foot/X = new(owner.loc, owner) - for(var/mob/M in viewers(owner)) - M.show_message("\red [owner.name]'s [X.name] flies off in an arc.") var/lol2 = pick(cardinal) step(X,lol2) destroyed = 1 @@ -377,7 +372,10 @@ W.wound_size = size W.owner = owner W.parent = src - spawn W.start_close() //Let small cuts close themselves. + if(type == 1) + spawn W.become_scar() + else + spawn W.start_close() //Let small cuts close themselves. wounds += W /datum/organ/wound @@ -389,6 +387,8 @@ var/datum/organ/external/parent var/bleeding = 0 //You got wounded, of course it's bleeding. -- Scratch that. Rewrote it. var/healing_state = 0 + var/is_healing = 0 + var/slowheal = 3 proc/start_close() sleep(rand(1800,3000)) //3-5 minutes @@ -400,7 +400,7 @@ stopbleeding() return sleep(rand(1800,3000)) - if(wound_size == 1) //Small cuts heal in 3-10 minutes. + if(wound_size == 1) //Small cuts heal in 6-10 minutes. parent.wounds.Remove(src) update_health(1) del(src) @@ -408,30 +408,34 @@ stopbleeding() return if(wound_size < 5 && bleeding) //Give it a chance to stop bleeding on it's own. - spawn(1) + spawn while(1) sleep(1200) if(prob(50)) stopbleeding() return return - proc/stopbleeding() - if(healing_state) + proc/stopbleeding(var/bleed = 0) + if(is_healing) return 0 // owner:bloodloss -= 10 * src.wound_size - parent.bleeding = 0 + parent.bleeding = min(bleed,bleeding) for(var/datum/organ/wound/W in parent) if(W.bleeding && W != src) parent.bleeding = 1 - bleeding = 0 + break + bleeding = min(bleed,bleeding) + is_healing = 1 + slowheal = 1 spawn become_scar() //spawn off the process of becoming a scar. return 1 proc/become_scar() healing_state = 1 //Patched - update_health(0.5) //Heals some. + spawn(200) //20 seconds + update_health(5) //Heals some. - sleep(rand(1800,3000)) //3-5 minutes + sleep(rand(1800,3000)*slowheal) //3-5 minutes if(parent.owner.stat == 2) return @@ -441,23 +445,26 @@ del(src) healing_state = 2 //Noticibly healing. - update_health(1) //Heals the rest of the way. + update_health(2) //Heals more. - sleep(rand(1800,3000)) //3-5 minutes + sleep(rand(1800,3000)*slowheal) //3-5 minutes if(parent.owner.stat == 2) return if(prob(60) && wound_size < 3) //Cuts heal up parent.wounds.Remove(src) del(src) healing_state = 3 //Angry red scar - sleep(rand(6000,9000)) //10-15 minutes + update_health(1) //Heals the rest of the way. + + + sleep(rand(6000,9000)*slowheal) //10-15 minutes if(parent.owner.stat == 2) return if(prob(80) && wound_size < 4) //Minor wounds heal up fully. parent.wounds.Remove(src) del(src) healing_state = 4 //Scar - sleep(rand(6000,9000)) //10-15 minutes + sleep(rand(6000,9000)*slowheal) //10-15 minutes if(parent.owner.stat == 2) return if(prob(30) || wound_size < 4 || wound_type == 1) //Small chance for the scar to disappear, any small remaining wounds deleted. @@ -467,11 +474,11 @@ return proc/update_health(var/percent = 1) - damage -= damage/percent //Remove that amount of the damage + damage = max(damage - damage/percent,0) //Remove that amount of the damage if(wound_type > 1) - parent.burn_dam -= initial_dmg - damage + parent.burn_dam = max(parent.burn_dam - (initial_dmg - damage),0) else - parent.brute_dam -= initial_dmg - damage + parent.brute_dam = max(parent.brute_dam - (initial_dmg - damage),0) initial_dmg = damage //reset it for further updates. parent.owner.updatehealth() From cd4a82a90bca4eb6a86360c4499ee4940a345427 Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Sat, 31 Mar 2012 22:00:17 -0700 Subject: [PATCH 2/4] Fixes for the fingerprint runtimes, other runtimes, the new damage system, and the new objective system, to reduce the super hard objectives. --- code/datums/datumvars.dm | 15 ++- code/datums/mind.dm | 1 + code/game/atom_procs.dm | 56 +++++---- code/game/gamemodes/newobjective.dm | 114 +++++++++++++----- code/game/machinery/doors/door.dm | 4 + code/game/objects/items/weapons/cards_ids.dm | 44 +++---- code/modules/DetectiveWork/detective_work.dm | 10 +- code/modules/admin/verbs/randomverbs.dm | 3 +- code/modules/chemical/Chemistry-Holder.dm | 4 + code/modules/chemical/Chemistry-Reagents.dm | 4 +- code/modules/chemical/Chemistry-Tools.dm | 4 +- .../mob/living/carbon/human/examine.dm | 7 +- code/modules/mob/living/carbon/human/human.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 2 +- code/modules/mob/mob_movement.dm | 2 +- code/modules/mob/organ/organ.dm | 7 +- code/modules/projectiles/gun.dm | 2 +- 17 files changed, 178 insertions(+), 103 deletions(-) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 591efbc60d7..e0058ee9d49 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -349,15 +349,20 @@ client if (L.len > 0 && !(name == "underlays" || name == "overlays" || name == "vars" || L.len > 500)) // not sure if this is completely right... - if (0) // (L.vars.len > 0) + if(0) //(L.vars.len > 0) html += "

    " - for (var/entry in L) - html += debug_variable(entry, L[entry], level + 1) + html += "
" else html += "
    " - for (var/index = 1, index <= L.len, index++) - html += debug_variable("[index]", L[index], level + 1) + var/index = 1 + for (var/entry in L) + if(istext(entry)) + html += debug_variable(entry, L[entry], level + 1) + //html += debug_variable("[index]", L[index], level + 1) + else + html += debug_variable(index, L[index], level + 1) + index++ html += "
" else html += "[name] = [value]" diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 30ff780a118..9422943f478 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -18,6 +18,7 @@ datum/mind var/has_been_rev = 0//Tracks if this mind has been a rev or not var/rev_cooldown = 0 + var/list/tempobjectives = list() //because otherwise they get de-referenced. proc/transfer_to(mob/new_character) if(current) diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm index 244ff000d6f..4d554d339b7 100644 --- a/code/game/atom_procs.dm +++ b/code/game/atom_procs.dm @@ -81,16 +81,16 @@ /atom/proc/add_fingerprint(mob/living/M as mob) if(isnull(M)) return if(isnull(M.key)) return - if (!( src.flags ) & 256) + if (!( flags ) & 256) return if (ishuman(M)) if(!fingerprintshidden) fingerprintshidden = list() add_fibers(M) if (M.mutations2 & mFingerprints) - if(src.fingerprintslast != M.key) - src.fingerprintshidden += "(Has no fingerprints) Real name: [M.real_name], Key: [M.key]" - src.fingerprintslast = M.key + if(fingerprintslast != M.key) + fingerprintshidden += "(Has no fingerprints) Real name: [M.real_name], Key: [M.key]" + fingerprintslast = M.key return 0 var/mob/living/carbon/human/H = M if (!istype(H.dna, /datum/dna) || !H.dna.uni_identity || (length(H.dna.uni_identity) != 32)) @@ -98,24 +98,24 @@ H.dna = new /datum/dna(null) H.check_dna() if (H.gloves && H.gloves != src) - if(src.fingerprintslast != H.key) - src.fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key) - src.fingerprintslast = H.key + if(fingerprintslast != H.key) + fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key) + fingerprintslast = H.key H.gloves.add_fingerprint(M) if(H.gloves != src) if(prob(75) && istype(H.gloves, /obj/item/clothing/gloves/latex)) return 0 else if(H.gloves && !istype(H.gloves, /obj/item/clothing/gloves/latex)) return 0 - if(src.fingerprintslast != H.key) - src.fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key) - src.fingerprintslast = H.key + if(fingerprintslast != H.key) + fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key) + fingerprintslast = H.key if(!fingerprints) fingerprints = list() var/new_prints = 0 var/prints - for(var/i = 1, i <= src.fingerprints.len, i++) - var/list/L = params2list(src.fingerprints[i]) + for(var/i = 1, i <= fingerprints.len, i++) + var/list/L = params2list(fingerprints[i]) if(L[num2text(1)] == md5(H.dna.uni_identity)) new_prints = i prints = L[num2text(2)] @@ -123,30 +123,28 @@ else var/test_print = stars(L[num2text(2)], rand(80,90)) if(stringpercent(test_print) == 32) - if(src.fingerprints.len == 1) - src.fingerprints = list() + if(fingerprints.len == 1) + fingerprints = list() else - for(var/j = i, j < (src.fingerprints.len), j++) - src.fingerprints[j] = src.fingerprints[j+1] - src.fingerprints.len-- + fingerprints.Cut(i,i+1) else - src.fingerprints[i] = "1=[L[num2text(1)]]&2=[test_print]" + fingerprints[i] = "1=[L[num2text(1)]]&2=[test_print]" if(new_prints) - src.fingerprints[new_prints] = text("1=[]&2=[]", md5(H.dna.uni_identity), stringmerge(prints,stars(md5(H.dna.uni_identity), (H.gloves ? rand(10,20) : rand(25,40))))) - else if(new_prints == 0) - if(!src.fingerprints || !src.fingerprints.len) - src.fingerprints = list(text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40)))) + fingerprints[new_prints] = text("1=[]&2=[]", md5(H.dna.uni_identity), stringmerge(prints,stars(md5(H.dna.uni_identity), (H.gloves ? rand(10,20) : rand(25,40))))) + else + if(!fingerprints || !fingerprints.len) + fingerprints = list(text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40)))) else - src.fingerprints += text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40))) - for(var/i = 1, i <= src.fingerprints.len, i++) - if(length(src.fingerprints[i]) != 69) - src.fingerprints.Remove(src.fingerprints[i]) + fingerprints += text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40))) + for(var/i = 1, i <= fingerprints.len, i++) + if(length(fingerprints[i]) != 69) + fingerprints.Remove(fingerprints[i]) if(fingerprints && !fingerprints.len) del(fingerprints) return 1 else - if(src.fingerprintslast != M.key) - src.fingerprintshidden += text("Real name: [], Key: []",M.real_name, M.key) - src.fingerprintslast = M.key + if(fingerprintslast != M.key) + fingerprintshidden += text("Real name: [], Key: []",M.real_name, M.key) + fingerprintslast = M.key return //returns 1 if made bloody, returns 0 otherwise diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm index dcd77d63c22..3f69a957d17 100644 --- a/code/game/gamemodes/newobjective.dm +++ b/code/game/gamemodes/newobjective.dm @@ -1,52 +1,85 @@ /proc/GenerateTheft(var/job,var/datum/mind/traitor) var/list/datum/objective/objectives = list() + var/list/weight = list() + var/index = 1 for(var/o in typesof(/datum/objective/steal)) if(o != /datum/objective/steal) //Make sure not to get a blank steal objective. var/datum/objective/target = new o(null,job) - objectives += list(target = target.weight) - - //objectives += GenerateAssassinate(job,traitor) - return objectives + weight += list("[index]" = target.weight) + objectives += target + index++ + world << objectives.len + return list(objectives, weight) /proc/GenerateAssassinate(var/job,var/datum/mind/traitor) var/list/datum/objective/assassinate/missions = list() + var/list/weight = list() + var/index = 1 for(var/datum/mind/target in ticker.minds) if((target != traitor) && istype(target.current, /mob/living/carbon/human)) if(target && target.current) var/datum/objective/target_obj = new /datum/objective/assassinate(null,job,target) - missions += list(target_obj = target_obj.weight) - return missions + weight += list("[index]" = target_obj.weight) + missions += target_obj + index++ + world << missions.len + return list(missions, weight) /proc/GenerateFrame(var/job,var/datum/mind/traitor) var/list/datum/objective/frame/missions = list() + var/list/weight = list() + var/index = 1 for(var/datum/mind/target in ticker.minds) if((target != traitor) && istype(target.current, /mob/living/carbon/human)) if(target && target.current) var/datum/objective/target_obj = new /datum/objective/frame(null,job,target) - missions += list(target_obj = target_obj.weight) - return missions + weight += list("[index]" = target_obj.weight) + missions += target_obj + index++ + world << missions.len + return list(missions, weight) /proc/GenerateProtection(var/job,var/datum/mind/traitor) var/list/datum/objective/frame/missions = list() + var/list/weight = list() + var/index = 1 for(var/datum/mind/target in ticker.minds) if((target != traitor) && istype(target.current, /mob/living/carbon/human)) if(target && target.current) var/datum/objective/target_obj = new /datum/objective/protection(null,job,target) - missions += list(target_obj = target_obj.weight) - return missions + weight += list("[index]" = target_obj.weight) + missions += target_obj + index++ + world << missions.len + return list(missions, weight) +/proc/PickObjectiveFromList(var/list/objectivesArray) + var/list/datum/objectives = objectivesArray[1] + var/pick_index = text2num(pickweight(objectivesArray[2])) + return objectives[pick_index] +/proc/RemoveObjectiveFromList(var/list/objectiveArray, var/datum/objective/objective) + var/list/datum/objective/temp = objectiveArray[1] + var/list/weight = objectiveArray[2] + var/index = temp.Find(objective) + if(index == temp.len) + temp.Cut(index) + weight.Cut(index) + else + temp.Cut(index, index+1) + weight.Cut(index, index+1) + return list(temp,weight) /proc/SelectObjectives(var/job,var/datum/mind/traitor,var/hijack = 0) - var/list/datum/objective/chosenobjectives = list() - var/list/datum/objective/theftobjectives = GenerateTheft(job,traitor) //Separated all the objective types so they can be picked independantly of each other. - var/list/datum/objective/killobjectives = GenerateAssassinate(job,traitor) - var/list/datum/objective/frameobjectives = GenerateFrame(job,traitor) - var/list/datum/objective/protectobjectives = GenerateProtection(job,traitor) + var/list/chosenobjectives = list() + var/list/theftobjectives = GenerateTheft(job,traitor) //Separated all the objective types so they can be picked independantly of each other. + var/list/killobjectives = GenerateAssassinate(job,traitor) + var/list/frameobjectives = GenerateFrame(job,traitor) + var/list/protectobjectives = GenerateProtection(job,traitor) //var/points var/totalweight var/selectobj @@ -54,27 +87,30 @@ while(totalweight < 100) selectobj = rand(1,100) //Randomly determine the type of objective to be given. - if(!length(killobjectives) || !length(protectobjectives)) //If any of these lists are empty, just give them theft objectives. - var/datum/objective/objective = pickweight(theftobjectives) + if(!length(killobjectives[1]) || !length(protectobjectives[1])|| !length(frameobjectives[1])) //If any of these lists are empty, just give them theft objectives. + var/datum/objective/objective = PickObjectiveFromList(theftobjectives) chosenobjectives += objective totalweight += objective.points - theftobjectives -= objective + theftobjectives = RemoveObjectiveFromList(theftobjectives, objective) else switch(selectobj) if(1 to 55) //Theft Objectives (55% chance) - var/datum/objective/objective = pickweight(theftobjectives) + var/datum/objective/objective = PickObjectiveFromList(theftobjectives) for(1 to 10) if(objective.points + totalweight <= 110) break - objective = pickweight(theftobjectives) + objective = PickObjectiveFromList(theftobjectives) chosenobjectives += objective totalweight += objective.points - theftobjectives -= objective + theftobjectives = RemoveObjectiveFromList(theftobjectives, objective) if(56 to 92) //Assassination Objectives (37% chance) - var/datum/objective/assassinate/objective = pickweight(killobjectives) + var/datum/objective/assassinate/objective = PickObjectiveFromList(killobjectives) + world << objective for(1 to 10) if(objective.points + totalweight <= 110) break - objective = pickweight(killobjectives) + objective = PickObjectiveFromList(killobjectives) + if(!objective) + continue for(var/datum/objective/protection/conflicttest in chosenobjectives) //Check to make sure we aren't telling them to Assassinate somebody they need to Protect. if(conflicttest.target == objective.target) conflict = 1 @@ -86,23 +122,37 @@ if(!conflict) chosenobjectives += objective totalweight += objective.points - killobjectives -= objective + killobjectives = RemoveObjectiveFromList(killobjectives, objective) conflict = 0 if(93 to 95) //Framing Objectives (3% chance) - var/datum/objective/objective = pickweight(frameobjectives) + var/datum/objective/objective = PickObjectiveFromList(frameobjectives) for(1 to 10) if(objective.points + totalweight <= 110) break - objective = pickweight(frameobjectives) - chosenobjectives += objective - totalweight += objective.points - frameobjectives -= objective + objective = PickObjectiveFromList(frameobjectives) + if(!objective) + continue + for(var/datum/objective/protection/conflicttest in chosenobjectives) //Check to make sure we aren't telling them to Assassinate somebody they need to Protect. + if(conflicttest.target == objective.target) + conflict = 1 + break + for(var/datum/objective/assassinate/conflicttest in chosenobjectives) //Check to make sure we aren't telling them to Protect somebody they need to Assassinate. + if(conflicttest.target == objective.target) + conflict = 1 + break + if(!conflict) + chosenobjectives += objective + totalweight += objective.points + frameobjectives = RemoveObjectiveFromList(frameobjectives, objective) + conflict = 0 if(96 to 100) //Protection Objectives (5% chance) - var/datum/objective/protection/objective = pickweight(protectobjectives) + var/datum/objective/protection/objective = PickObjectiveFromList(protectobjectives) for(1 to 10) if(objective.points + totalweight <= 110) break - objective = pickweight(protectobjectives) + objective = PickObjectiveFromList(protectobjectives) + if(!objective) + continue for(var/datum/objective/assassinate/conflicttest in chosenobjectives) //Check to make sure we aren't telling them to Protect somebody they need to Assassinate. if(conflicttest.target == objective.target) conflict = 1 @@ -114,7 +164,7 @@ if(!conflict) chosenobjectives += objective totalweight += objective.points - protectobjectives -= objective + protectobjectives = RemoveObjectiveFromList(protectobjectives, objective) conflict = 0 var/hasendgame = 0 diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 128b01d9eef..a1d6311b34d 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -185,7 +185,11 @@ if (src.density) open() else + var/holdopen_old = holdopen + holdopen = 0 close() + spawn(1) + holdopen = holdopen_old else if (src.density) flick("door_deny", src) return diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index e190fbd2c6a..e2dd58be852 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -195,26 +195,26 @@ FINGERPRINT CARD return "There are no fingerprints on this card." return -/obj/item/weapon/f_card/attack_hand(mob/user as mob) +///obj/item/weapon/f_card/attack_hand(mob/user as mob) - if ((user.r_hand == src || user.l_hand == src)) - src.add_fingerprint(user) - var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user ) - F.amount = 1 - src.amount-- - if (user.hand) - user.l_hand = F - else - user.r_hand = F - F.layer = 20 - F.add_fingerprint(user) - if (src.amount < 1) - //SN src = null - del(src) - return - else - ..() - return +// if ((user.r_hand == src || user.l_hand == src)) +// add_fingerprint(user) +// var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user ) +// F.amount = 1 +// src.amount-- +// if (user.hand) +// user.l_hand = F +// else +// user.r_hand = F +// F.layer = 20 +// F.add_fingerprint(user) +// if (src.amount < 1) +// //SN src = null +// del(src) +// return +// else +// ..() +// return /obj/item/weapon/f_card/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() @@ -253,10 +253,10 @@ FINGERPRINT CARD ..() if (!istype(usr, /mob/living/silicon)) - if (src.fingerprints) + if (fingerprints) if (src.amount > 1) var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card(get_turf(src)) F.amount = --src.amount - src.amount = 1 - src.icon_state = "fingerprint1" + amount = 1 + icon_state = "fingerprint1" return \ No newline at end of file diff --git a/code/modules/DetectiveWork/detective_work.dm b/code/modules/DetectiveWork/detective_work.dm index 6878b2dd5a1..7e5b2bcdfb7 100644 --- a/code/modules/DetectiveWork/detective_work.dm +++ b/code/modules/DetectiveWork/detective_work.dm @@ -199,7 +199,6 @@ obj/machinery/computer/forensic_scanning M.drop_item() I.loc = src process_card() - usr << "You insert the card, and it is destroyed by the machinery in the process of comparing prints." else usr << "\red Invalid Object Rejected." if("database") @@ -646,7 +645,9 @@ obj/machinery/computer/forensic_scanning return proc/process_card() //Same as above, but for fingerprint cards - if(card.fingerprints && !(card.amount > 1)) + if(card.fingerprints && !(card.amount > 1) && islist(card.fingerprints) && files && files.len) + usr << "You insert the card, and it is destroyed by the machinery in the process of comparing prints." + var/found = 0 for(var/k = 1, k <= card.fingerprints.len, k++) var/list/test_prints = params2list(card.fingerprints[k]) var/print = test_prints[num2text(1)] @@ -657,7 +658,12 @@ obj/machinery/computer/forensic_scanning if(perp == print) test_list[1] = "1=" + print + "&2=" + print files[i] = test_list + found = 1 break + if(found) + usr << "The machinery finds can completes a match." + else + usr << "No match found." del(card) else usr << "\red ERROR: No prints/too many cards." diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 363d95d88f2..d9b99a5ee7c 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -511,8 +511,9 @@ Traitors and the like can also be revived with the previous role mostly intact. e.perma_injury = 0 e.update_icon() for(var/datum/organ/wound/W in e.wounds) - if(W.bleeding) + if(W.bleeding || !W.is_healing) W.stopbleeding() + del(H.vessel) H.vessel = new/datum/reagents(560) H.vessel.my_atom = H H.vessel.add_reagent("blood",560) diff --git a/code/modules/chemical/Chemistry-Holder.dm b/code/modules/chemical/Chemistry-Holder.dm index da6e433f02a..d429802cb57 100644 --- a/code/modules/chemical/Chemistry-Holder.dm +++ b/code/modules/chemical/Chemistry-Holder.dm @@ -317,6 +317,10 @@ datum for(var/A in reagent_list) var/datum/reagent/R = A + if(R.id == "blood" && reagent == R.id) + if(R.data && data) + if(R.data["donor"] != data["donor"]) + continue if (R.id == reagent) R.volume += amount update_total() diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm index b9b360eeb87..d54eafc97ca 100644 --- a/code/modules/chemical/Chemistry-Reagents.dm +++ b/code/modules/chemical/Chemistry-Reagents.dm @@ -103,8 +103,8 @@ datum color = "#C80000" // rgb: 200, 0, 0 on_mob_life(var/mob/living/M) if(istype(M, /mob/living/carbon/human) && blood_incompatible(data["blood_type"],M.dna.b_type)) - M.adjustToxLoss(rand(1.5,3)) - M.adjustOxyLoss(rand(1.5,3)) + M.adjustToxLoss(rand(0.5,1.5)) + M.adjustOxyLoss(rand(1,1.5)) ..() return diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm index acc4fb665a7..0d60cbb0899 100644 --- a/code/modules/chemical/Chemistry-Tools.dm +++ b/code/modules/chemical/Chemistry-Tools.dm @@ -1078,8 +1078,8 @@ var/trans if(B && ishuman(target)) var/mob/living/carbon/human/H = target - H.vessel.add_reagent("blood",5,B) - src.reagents.remove_reagent("blood",5) + H.vessel.add_reagent("blood",(B.volume > 5? 5 : B.volume),B.data) + src.reagents.remove_reagent("blood",(B.volume > 5? 5 : B.volume)) else trans = src.reagents.trans_to(target, amount_per_transfer_from_this) user << "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units." diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 627ec60cd0a..8a038c84163 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -349,11 +349,11 @@ "severe burn" = "severe burn", "deep burn" = "deep burn", "carbonised area" = "carbonised area") switch(i) if(2) //Healing wounds. - if(tallied in list("cut","tiny bruise","small burn")) + if(tallied in list("cut","small burn")) continue tallied_rename = list("deep cut" = "clotted cut", "flesh wound" = "small bandaged wound",\ "gaping wound" = "bandaged wound", "big gaping wound" = "gauze wrapped wound",\ - "massive wound" = "massive blood soaked bandage", "small bruise" = "small bruise",\ + "massive wound" = "massive blood soaked bandage", "tiny bruise" = "tiny bruise", "small bruise" = "small bruise",\ "moderate bruise" = "moderate bruise", "large bruise" = "large bruise",\ "huge bruise" = "huge bruise", "monumental bruise" = "monumental bruise",\ "moderate burn" = "moderate salved burn", "large burn" = "large salved burn",\ @@ -380,7 +380,7 @@ "large burn" = "large burn scar", "severe burn" = "severe burn scar",\ "deep burn" = "deep burn scar", "carbonised area" = "healing carbonised area") if(5) - if(tallied in list("cut","deep cut","tiny bruise", "small bruise", "moderate bruise","small burn", "moderate burn")) + if(tallied in list("cut","deep cut","tiny bruise", "moderate bruise", "small bruise","small burn", "moderate burn")) continue tallied_rename = list("flesh wound" = "small scar", "gaping wound" = "straight scar",\ "big gaping wound" = "jagged scar", "massive wound" = "gigantic scar",\ @@ -429,6 +429,7 @@ flavor_text_string += flavor_text[text] flavor_text_string += " on [t_his] [named].
" wound_flavor_text["[named]"] = flavor_text_string + world << "[named] + [flavor_text_string]" if(wound_flavor_text["head"] && !skipmask && !(wear_mask && istype(wear_mask, /obj/item/clothing/mask/gas))) msg += wound_flavor_text["head"] else if(is_bleeding["head"]) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 7eff4a056f6..b9935eb3bda 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -114,7 +114,7 @@ update_clothing() src << "\blue Your icons have been generated!" - vessel = new/datum/reagents(560) + vessel = new/datum/reagents(600) vessel.my_atom = src vessel.add_reagent("blood",560) spawn(1) fixblood() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index d93cd88af4d..82d714813d3 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -447,7 +447,7 @@ return null update_canmove() - if(paralysis || stunned || weakened || buckled || (changeling && changeling.changeling_fakedeath)) canmove = 0 + if(paralysis || resting || stunned || weakened || buckled || (changeling && changeling.changeling_fakedeath)) canmove = 0 else canmove = 1 handle_breath(datum/gas_mixture/breath) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index d30fc1ab884..bb80c607407 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -156,7 +156,7 @@ if(Process_Grab()) return //Making mob movememnt changes instant. - if(mob.paralysis || mob.stunned || mob.weakened || mob.buckled || (mob.changeling && mob.changeling.changeling_fakedeath)) + if(mob.paralysis || mob.stunned || mob.resting || mob.weakened || mob.buckled || (mob.changeling && mob.changeling.changeling_fakedeath)) mob.canmove = 0 return else diff --git a/code/modules/mob/organ/organ.dm b/code/modules/mob/organ/organ.dm index 6fb0e1c62d8..4e3acabe4f4 100644 --- a/code/modules/mob/organ/organ.dm +++ b/code/modules/mob/organ/organ.dm @@ -73,6 +73,11 @@ owner = H H.organs[name] = src + Del() + for(var/datum/organ/wound/W in wounds) + del(W) + ..() + proc/take_damage(brute, burn, sharp, used_weapon = null) if((brute <= 0) && (burn <= 0)) return 0 @@ -432,7 +437,7 @@ proc/become_scar() healing_state = 1 //Patched - spawn(200) //20 seconds + spawn(200*slowheal) //20 seconds update_health(5) //Heals some. sleep(rand(1800,3000)*slowheal) //3-5 minutes diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index c388bba9795..b11348dd6b1 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -98,7 +98,7 @@ playsound(user, fire_sound, 10, 1) else playsound(user, fire_sound, 50, 1) - M.apply_damage(30+in_chamber.damage, BRUTE, used_weapon = "Point Blank Shot") //So we'll put him an inch from death. + M.apply_damage(30+in_chamber.damage, BRUTE, user.zone_sel.selecting, used_weapon = "Point Blank Shot") //So we'll put him an inch from death. M.attack_log += text("\[[]\] []/[] shot []/[] point blank with a []", time_stamp(), user, user.ckey, M, M.ckey, src) user.attack_log += text("\[[]\] []/[] shot []/[] point blank with a []", time_stamp(), user, user.ckey, M, M.ckey, src) log_admin("ATTACK: [user] ([user.ckey]) shot [M] ([M.ckey]) point blank with [src].") From c1262a004c1546600579179e7be8d7494babf03d Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Sun, 1 Apr 2012 09:13:20 -0700 Subject: [PATCH 3/4] Removed unused variable I forgot about. --- code/datums/mind.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 9422943f478..30ff780a118 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -18,7 +18,6 @@ datum/mind var/has_been_rev = 0//Tracks if this mind has been a rev or not var/rev_cooldown = 0 - var/list/tempobjectives = list() //because otherwise they get de-referenced. proc/transfer_to(mob/new_character) if(current) From aece74cdf3b8264adc070aa186c53044a67bbc36 Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Sun, 1 Apr 2012 12:35:32 -0700 Subject: [PATCH 4/4] Fixed some debugging info. --- code/game/gamemodes/newobjective.dm | 4 ---- code/modules/mob/living/carbon/human/life.dm | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm index 3f69a957d17..653bf079f8d 100644 --- a/code/game/gamemodes/newobjective.dm +++ b/code/game/gamemodes/newobjective.dm @@ -9,7 +9,6 @@ weight += list("[index]" = target.weight) objectives += target index++ - world << objectives.len return list(objectives, weight) /proc/GenerateAssassinate(var/job,var/datum/mind/traitor) @@ -24,7 +23,6 @@ weight += list("[index]" = target_obj.weight) missions += target_obj index++ - world << missions.len return list(missions, weight) /proc/GenerateFrame(var/job,var/datum/mind/traitor) @@ -39,7 +37,6 @@ weight += list("[index]" = target_obj.weight) missions += target_obj index++ - world << missions.len return list(missions, weight) /proc/GenerateProtection(var/job,var/datum/mind/traitor) @@ -54,7 +51,6 @@ weight += list("[index]" = target_obj.weight) missions += target_obj index++ - world << missions.len return list(missions, weight) /proc/PickObjectiveFromList(var/list/objectivesArray) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 82d714813d3..d06b3a1e344 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -857,7 +857,7 @@ leg_tally-- // let it fail even if just foot&leg // can't stand - if(leg_tally == 0 && !paralysis) + if(leg_tally == 0 && !paralysis && !(lying || resting)) emote("scream") emote("collapse") paralysis = 10