diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm index 708561f06ab..e195bd30bb3 100644 --- a/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm +++ b/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm @@ -21,7 +21,7 @@ del(O.organs) O.organs = organs for(var/name in O.organs) - var/datum/organ/external/organ = O[name] + var/datum/organ/external/organ = O.organs[name] organ.owner = O for(var/obj/item/weapon/implant/implant in organ.implant) implant.imp_in = O diff --git a/code/game/dna.dm b/code/game/dna.dm index 2aa8f9dc38b..c88f7c03670 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -531,7 +531,7 @@ del(O.organs) O.organs = H.organs for(var/name in O.organs) - var/datum/organ/external/organ = O[name] + var/datum/organ/external/organ = O.organs[name] organ.owner = O for(var/obj/item/weapon/implant/implant in organ.implant) implant.imp_in = O @@ -605,7 +605,7 @@ del(O.organs) O.organs = M.organs for(var/name in O.organs) - var/datum/organ/external/organ = O[name] + var/datum/organ/external/organ = O.organs[name] organ.owner = O for(var/obj/item/weapon/implant/implant in organ.implant) implant.imp_in = O diff --git a/code/game/objects/closets/wardrobe.dm b/code/game/objects/closets/wardrobe.dm index 46ea08a395c..6a95bb88293 100644 --- a/code/game/objects/closets/wardrobe.dm +++ b/code/game/objects/closets/wardrobe.dm @@ -273,9 +273,6 @@ obj/structure/closet/wardrobe/hop/New() new /obj/item/clothing/under/rank/bartender(src) new /obj/item/clothing/under/rank/bartender(src) new /obj/item/clothing/under/rank/bartender(src) - new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/clothing/suit/armor/vest(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 21f2325fd55..e22d0a9bf18 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -252,8 +252,8 @@ the implant may become unstable and either pre-maturely inject the subject or si if(istype(imp_in, /mob/)) var/mob/T = imp_in T.gib() - explosion(find_loc(src), 1, 3, 4, 6, 3) - var/turf/t = find_loc(src) + explosion(find_loc(imp_in), 1, 3, 4, 6, 3) + var/turf/t = find_loc(imp_in) if(t) t.hotspot_expose(3500,125) del(src) @@ -292,9 +292,9 @@ the implant may become unstable and either pre-maturely inject the subject or si del(a) processing_objects.Remove(src) else if(M.stat == 2) - var/turf/t = get_turf(M) + var/area/t = get_area(M) var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null) - a.autosay("states, \"[mobname] has died in [t.loc.name]!\"", "[mobname]'s Death Alarm") + a.autosay("states, \"[mobname] has died in [t.name]!\"", "[mobname]'s Death Alarm") del(a) processing_objects.Remove(src) diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index b4d225681c9..3d76105f862 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -17,7 +17,7 @@ if (!msg) return - var/rendered = "DEAD: ADMIN([src.stealth ? pick("\[DATA EXPUNGED\]", "\[REDACTED\]", "¦¦¦¦¦¦¦¦¦¦") : src.key]) says, \"[msg]\"" + var/rendered = "DEAD: ADMIN([src.stealth ? pick("\[DATA EXPUNGED\]", "\[REDACTED\]", "\[O5 EYES ONLY\]") : src.key]) says, \"[msg]\"" for (var/mob/M in world) if (istype(M, /mob/new_player)) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 046ab1e8867..e2f15d031e1 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -83,15 +83,36 @@ new /datum/organ/external/r_arm(src) new /datum/organ/external/r_leg(src) new /datum/organ/external/l_leg(src) - - var/datum/organ/external/part = new /datum/organ/external/l_hand(src) - part.parent = organs["l_arm"] - part = new /datum/organ/external/l_foot(src) - part.parent = organs["l_leg"] - part = new /datum/organ/external/r_hand(src) - part.parent = organs["r_arm"] - part = new /datum/organ/external/r_foot(src) + new /datum/organ/external/l_hand(src) + new /datum/organ/external/l_foot(src) + new /datum/organ/external/r_hand(src) + new /datum/organ/external/r_foot(src) + var/datum/organ/external/part = organs["chest"] + part.children = list(organs["r_leg"],organs["l_leg"],organs["r_arm"],organs["l_arm"],organs["groin"],organs["head"]) + part = organs["head"] + part.parent = organs["chest"] + part = organs["groin"] + part.parent = organs["chest"] + part = organs["r_leg"] + part.children = list(organs["r_foot"]) + part.parent = organs["chest"] + part = organs["l_leg"] + part.children = list(organs["l_foot"]) + part.parent = organs["chest"] + part = organs["r_arm"] + part.children = list(organs["r_hand"]) + part.parent = organs["chest"] + part = organs["l_arm"] + part.children = list(organs["l_hand"]) + part.parent = organs["chest"] + part = organs["r_foot"] part.parent = organs["r_leg"] + part = organs["l_foot"] + part.parent = organs["l_leg"] + part = organs["r_hand"] + part.parent = organs["r_arm"] + part = organs["l_hand"] + part.parent = organs["l_arm"] var/g = "m" if (gender == MALE) @@ -135,9 +156,9 @@ var/turf/T = get_turf(src) var/list/obj/effect/decal/cleanable/blood/drip/nums = list() var/list/iconL = list("1","2","3","4","5") - + vessel.remove_reagent("blood",amm) - + for(var/obj/effect/decal/cleanable/blood/drip/G in T) nums += G iconL.Remove(G.icon_state) @@ -148,12 +169,12 @@ if(virus2) D.virus2 = virus2.getcopy() return - + var/obj/effect/decal/cleanable/blood/drip/this = new(T) this.icon_state = pick(iconL) this.blood_DNA = list(list(dna.unique_enzymes,dna.b_type)) this.blood_owner = src - + if(virus2) this.virus2 = virus2.getcopy() diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 2c804e7a382..85b02146d84 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -25,22 +25,43 @@ dna.b_type = "A+" dna.original_name = real_name - new /datum/organ/external/chest(src) + new /datum/organ/external/chest(src) new /datum/organ/external/groin(src) new /datum/organ/external/head(src) new /datum/organ/external/l_arm(src) new /datum/organ/external/r_arm(src) new /datum/organ/external/r_leg(src) new /datum/organ/external/l_leg(src) - - var/datum/organ/external/part = new /datum/organ/external/l_hand(src) - part.parent = organs["l_arm"] - part = new /datum/organ/external/l_foot(src) - part.parent = organs["l_leg"] - part = new /datum/organ/external/r_hand(src) - part.parent = organs["r_arm"] - part = new /datum/organ/external/r_foot(src) + new /datum/organ/external/l_hand(src) + new /datum/organ/external/l_foot(src) + new /datum/organ/external/r_hand(src) + new /datum/organ/external/r_foot(src) + var/datum/organ/external/part = organs["chest"] + part.children = list(organs["r_leg"],organs["l_leg"],organs["r_arm"],organs["l_arm"],organs["groin"],organs["head"]) + part = organs["head"] + part.parent = organs["chest"] + part = organs["groin"] + part.parent = organs["chest"] + part = organs["r_leg"] + part.children = list(organs["r_foot"]) + part.parent = organs["chest"] + part = organs["l_leg"] + part.children = list(organs["l_foot"]) + part.parent = organs["chest"] + part = organs["r_arm"] + part.children = list(organs["r_hand"]) + part.parent = organs["chest"] + part = organs["l_arm"] + part.children = list(organs["l_hand"]) + part.parent = organs["chest"] + part = organs["r_foot"] part.parent = organs["r_leg"] + part = organs["l_foot"] + part.parent = organs["l_leg"] + part = organs["r_hand"] + part.parent = organs["r_arm"] + part = organs["l_hand"] + part.parent = organs["l_arm"] spawn (1) if(!stand_icon) diff --git a/code/modules/mob/organ/organ.dm b/code/modules/mob/organ/organ.dm index 6f63897ae87..a2ade84803b 100644 --- a/code/modules/mob/organ/organ.dm +++ b/code/modules/mob/organ/organ.dm @@ -24,11 +24,11 @@ proc/copy() var/datum/autopsy_data/W = new() - W.weapon = src.weapon - W.pretend_weapon = src.pretend_weapon - W.damage = src.damage - W.hits = src.hits - W.time_inflicted = src.time_inflicted + W.weapon = weapon + W.pretend_weapon = pretend_weapon + W.damage = damage + W.hits = hits + W.time_inflicted = time_inflicted return W /**************************************************** @@ -57,8 +57,10 @@ tmp/destroyed = 0 tmp/destspawn = 0 //Has it spawned the broken limb? tmp/gauzed = 0 //Has the missing limb been patched? + tmp/robot = 0 //ROBOT ARM MAN! min_broken_damage = 30 datum/organ/external/parent + list/datum/organ/external/children damage_msg = "\red You feel a intense pain" var/open = 0 @@ -95,46 +97,61 @@ droplimb() return else if(prob(nux)) - createwound(max(1,min(6,round(brute/10) + rand(0,2))),0,brute) + createwound(max(1,min(6,round(brute/10) + rand(0,1))),0,brute) owner << "You feel something wet on your [display_name]" if((brute_dam + burn_dam + brute + burn) < max_damage) if(brute) brute_dam += brute - if(prob(brute) && brute > 20 && !sharp) + if(prob(brute*2) && !sharp) createwound(rand(4,6),0,brute) else if(!sharp) - createwound(max(1,min(6,round(brute/10) + rand(1,3))),1,brute) + createwound(max(1,min(6,round(brute/10) + rand(1,2))),1,brute) if(burn) burn_dam += burn - createwound(max(1,min(6,round(burn/10) + rand(0,2))),2,burn) + createwound(max(1,min(6,round(burn/10) + rand(0,1))),2,burn) else - var/can_inflict = src.max_damage - (src.brute_dam + src.burn_dam) + var/can_inflict = max_damage - (brute_dam + burn_dam) if(can_inflict) if (brute > 0 && burn > 0) brute = can_inflict/2 burn = can_inflict/2 var/ratio = brute / (brute + burn) - src.brute_dam += ratio * can_inflict - src.burn_dam += (1 - ratio) * can_inflict + brute_dam += ratio * can_inflict + burn_dam += (1 - ratio) * can_inflict else if (brute > 0) brute = can_inflict - src.brute_dam += brute - if(!sharp) createwound(max(1,min(6,round(brute/10) + rand(-1,1))),1,brute) + brute_dam += brute + if(!sharp && !prob(brute*3)) createwound(max(1,min(6,round(brute/10) + rand(0,1))),1,brute) + else createwound(max(1,min(6,round(brute/10) + rand(1,2))),1,brute) else burn = can_inflict - src.burn_dam += burn - createwound(max(1,min(6,round(burn/10) + rand(-1,1))),2,burn) + burn_dam += burn + createwound(max(1,min(6,round(burn/10) + rand(0,1))),2,burn) else - return 0 + var/passed_dam = (brute_dam + burn_dam) - can_inflict //Getting how much overdamage we have. + var/list/datum/organ/external/possible_points = list() + if(parent) + possible_points += parent + if(children) + possible_points += children + if(!possible_points.len) + message_admins("Oh god WHAT! [owner]'s [src] was unable to find an organ to pass overdamage too!") + else + var/datum/organ/external/target = pick(possible_points) + if(brute) + target.take_damage(passed_dam, 0, sharp, used_weapon) + else + target.take_damage(0, passed_dam, sharp, used_weapon) + if(broken) owner.emote("scream") if(used_weapon) add_wound(used_weapon, brute + burn) - var/result = src.update_icon() + var/result = update_icon() return result @@ -250,18 +267,18 @@ if(burn_dam ==0) tburn =0 - else if (src.burn_dam < (src.max_damage * 0.25 / 2)) + else if (burn_dam < (max_damage * 0.25 / 2)) tburn = 1 - else if (src.burn_dam < (src.max_damage * 0.75 / 2)) + else if (burn_dam < (max_damage * 0.75 / 2)) tburn = 2 else tburn = 3 - if (src.brute_dam == 0) + if (brute_dam == 0) tbrute = 0 - else if (src.brute_dam < (src.max_damage * 0.25 / 2)) + else if (brute_dam < (max_damage * 0.25 / 2)) tbrute = 1 - else if (src.brute_dam < (src.max_damage * 0.75 / 2)) + else if (brute_dam < (max_damage * 0.75 / 2)) tbrute = 2 else tbrute = 3 @@ -271,9 +288,9 @@ // new damage icon system // adjusted to set damage_state to brute/burn code only (without r_name0 as before) proc/update_icon() - var/n_is = src.damage_state_text() - if (n_is != src.damage_state) - src.damage_state = n_is + var/n_is = damage_state_text() + if (n_is != damage_state) + damage_state = n_is return 1 return 0 @@ -286,6 +303,9 @@ del(implants) //owner.unlock_medal("Lost something?", 0, "Lose a limb.", "easy") + for(var/datum/organ/external/I in children) + if(I && !I.destroyed) + I.droplimb(1) var/obj/item/weapon/organ/H switch(body_part) if(UPPER_TORSO) @@ -315,34 +335,18 @@ H = new /obj/item/weapon/organ/r_arm(owner.loc, owner) if(ismonkey(owner)) H.icon_state = "r_arm_l" - if(owner:organs["r_hand"]) - var/datum/organ/external/S = owner:organs["r_hand"] - if(!S.destroyed) - S.droplimb(1) if(ARM_LEFT) H = new /obj/item/weapon/organ/l_arm(owner.loc, owner) if(ismonkey(owner)) H.icon_state = "l_arm_l" - if(owner:organs["l_hand"]) - var/datum/organ/external/S = owner:organs["l_hand"] - if(!S.destroyed) - S.droplimb(1) if(LEG_RIGHT) H = new /obj/item/weapon/organ/r_leg(owner.loc, owner) if(ismonkey(owner)) H.icon_state = "r_leg_l" - if(owner:organs["r_foot"]) - var/datum/organ/external/S = owner:organs["r_foot"] - if(!S.destroyed) - S.droplimb(1) if(LEG_LEFT) H = new /obj/item/weapon/organ/l_leg(owner.loc, owner) if(ismonkey(owner)) H.icon_state = "l_leg_l" - if(owner:organs["l_foot"]) - var/datum/organ/external/S = owner:organs["l_foot"] - if(!S.destroyed) - S.droplimb(1) if(HAND_RIGHT) H = new /obj/item/weapon/organ/r_hand(owner.loc, owner) if(ismonkey(owner)) @@ -377,12 +381,12 @@ proc/createwound(var/size = 1, var/type = 0, var/damage) var/list/datum/organ/wound/possible_wounds = list() for(var/datum/organ/wound/W in wounds) - if(W.type == type && W.wound_size < 3 && size < 3 && !W.is_healing) + if(W.wound_type == type && W.wound_size <= 3 && size <= 3 && ((!W.is_healing && type == 1) || (!W.healing_state && type != 1))) possible_wounds += W - if(ishuman(owner)) - if(!possible_wounds.len || prob(25)) + if(hasorgans(owner)) + if(!possible_wounds.len || prob(20)) var/datum/organ/wound/W = new(src) - bleeding = !type //Sharp objects cause bleeding. + bleeding = max(!type,bleeding) //Sharp objects cause bleeding. W.bleeding = !type // owner:bloodloss += 10 * size W.damage = damage @@ -403,12 +407,7 @@ // owner:bloodloss += 10 * size W.damage += damage W.initial_dmg += damage - W.wound_size = round(sqrt(size^2 + W.wound_size^2)) - if(type == 1) - spawn W.become_scar() - else - spawn W.start_close() //Let small cuts close themselves. - wounds += W + W.wound_size = max(1,min(6,round(damage/10) + rand(0,1))) /datum/organ/wound name = "wound" @@ -459,17 +458,21 @@ bleeding = min(bleed,bleeding) is_healing = 1 slowheal = 1 - spawn become_scar() //spawn off the process of becoming a scar. + if(!healing_state) + spawn become_scar() //spawn off the process of becoming a scar. return 1 proc/become_scar() healing_state = 1 //Patched - spawn(200*slowheal) //20 seconds + spawn(200*slowheal) //~20-60 seconds update_health(5) //Heals some. sleep(rand(1800,3000)*slowheal) //3-5 minutes - if(parent.owner.stat == 2) + if(!parent || !parent.owner || parent.owner.stat == 2) + if(!parent || !parent.owner) + del(parent) + del(src) return if(prob(80) && wound_size < 2) //Small cuts heal. update_health(1) @@ -480,7 +483,10 @@ update_health(2) //Heals more. sleep(rand(1800,3000)*slowheal) //3-5 minutes - if(parent.owner.stat == 2) + if(!parent || !parent.owner || parent.owner.stat == 2) + if(!parent || !parent.owner) + del(parent) + del(src) return if(prob(60) && wound_size < 3) //Cuts heal up parent.wounds.Remove(src) @@ -490,14 +496,20 @@ sleep(rand(6000,9000)*slowheal) //10-15 minutes - if(parent.owner.stat == 2) + if(!parent || !parent.owner || parent.owner.stat == 2) + if(!parent || !parent.owner) + del(parent) + del(src) 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)*slowheal) //10-15 minutes - if(parent.owner.stat == 2) + if(!parent || !parent.owner || parent.owner.stat == 2) + if(!parent || !parent.owner) + del(parent) + del(src) return if(prob(30) || wound_size < 4 || wound_type == 1) //Small chance for the scar to disappear, any small remaining wounds deleted. parent.wounds.Remove(src)