diff --git a/baystation12.dme b/baystation12.dme index 344c54397ed..6d131d1232f 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1140,4 +1140,4 @@ #include "code\ZAS\Variable Settings.dm" #include "interface\skin.dmf" #include "maps\tgstation.2.0.8.dmm" -// END_INCLUDE \ No newline at end of file +// END_INCLUDE diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/say.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/say.dm index d65e10abdde..de333045f0b 100644 --- a/code/WorkInProgress/Cael_Aislinn/Tajara/say.dm +++ b/code/WorkInProgress/Cael_Aislinn/Tajara/say.dm @@ -377,11 +377,12 @@ for (var/mob/M in W) W |= M.contents - if(ishuman(M)) - var/mob/living/carbon/human/G = M - for(var/name in G.organs) - var/datum/organ/external/F = G.organs[name] - W |= F.implant + if(hasorgans(M)) + var/mob/living/carbon/G = M + for(var/name in G:organs) + var/datum/organ/external/F = G:organs[name] + for(var/obj/item/weapon/implant/I in F.implant) + W |= I for (var/obj/item/device/pda/M in W) W |= M.contents 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/datums/configuration.dm b/code/datums/configuration.dm index a929f8342a2..d9974c18097 100644 --- a/code/datums/configuration.dm +++ b/code/datums/configuration.dm @@ -71,6 +71,8 @@ var/revival_brain_life = -1 var/require_heads_alive = 0 //For Rev. + var/appeal_address = "" + /datum/configuration/New() var/list/L = typesof(/datum/game_mode) - /datum/game_mode for (var/T in L) @@ -291,6 +293,9 @@ if("require_heads_alive") config.require_heads_alive = value + if("appeal_address") + config.appeal_address = value + else diary << "Unknown setting in configuration: '[name]'" diff --git a/code/game/dna.dm b/code/game/dna.dm index cb0221b6c50..c88f7c03670 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -509,13 +509,8 @@ // human > monkey var/mob/living/carbon/human/H = M H.monkeyizing = 1 - var/list/implants = list() //Try to preserve implants. - for(var/obj/item/weapon/implant/W in H) - implants += W - W.loc = null - if(!connected) - for(var/obj/item/W in (H.contents-implants)) + for(var/obj/item/W in (H.contents)) if (W==H.w_uniform) // will be teared continue H.drop_from_slot(W) @@ -536,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 @@ -553,7 +548,7 @@ M.viruses -= D - for(var/obj/T in (M.contents-implants)) + for(var/obj/T in (M.contents)) del(T) //for(var/R in M.organs) // del(M.organs[text("[]", R)]) @@ -584,12 +579,8 @@ // monkey > human, var/mob/living/carbon/monkey/Mo = M Mo.monkeyizing = 1 - var/list/implants = list() //Still preserving implants - for(var/obj/item/weapon/implant/W in Mo) - implants += W - W.loc = null if(!connected) - for(var/obj/item/W in (Mo.contents-implants)) + for(var/obj/item/W in (Mo.contents)) Mo.drop_from_slot(W) M.update_clothing() M.monkeyizing = 1 @@ -614,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/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm index 3e3eeb5c6ae..5b286698096 100644 --- a/code/game/gamemodes/newobjective.dm +++ b/code/game/gamemodes/newobjective.dm @@ -56,11 +56,11 @@ /proc/PickObjectiveFromList(var/list/objectivesArray) var/list/datum/objectives = objectivesArray[1] var/pick_index = text2num(pickweight(objectivesArray[2])) - if (pick_index > objectives.len || pick_index < 1) - log_admin("Objective picking failed. Error logged. One or more traitors will need to be manually-assigned objectives") + log_admin("Objective picking failed. Error logged. One or more traitors will need to be manually-assigned objectives. Pick_index was [pick_index]. Tell Sky.") + message_admins("Objective picking failed. Error logged. One or more traitors will need to be manually-assigned objectives. Pick_index was [pick_index]. Tell Sky.") CRASH("Objective picking failed. Pick_index was [pick_index].") - + return objectives[pick_index] /proc/RemoveObjectiveFromList(var/list/objectiveArray, var/datum/objective/objective) @@ -97,7 +97,7 @@ if(1 to 55) //Theft Objectives (55% chance) var/datum/objective/objective = PickObjectiveFromList(theftobjectives) for(1 to 10) - if(objective.points + totalweight <= 110) + if(objective.points + totalweight <= 100) break objective = PickObjectiveFromList(theftobjectives) chosenobjectives += objective @@ -107,7 +107,7 @@ var/datum/objective/assassinate/objective = PickObjectiveFromList(killobjectives) world << objective for(1 to 10) - if(objective.points + totalweight <= 110) + if(objective.points + totalweight <= 100) break objective = PickObjectiveFromList(killobjectives) if(!objective) @@ -128,7 +128,7 @@ if(93 to 95) //Framing Objectives (3% chance) var/datum/objective/objective = PickObjectiveFromList(frameobjectives) for(1 to 10) - if(objective.points + totalweight <= 110) + if(objective.points + totalweight <= 100) break objective = PickObjectiveFromList(frameobjectives) if(!objective) @@ -149,7 +149,7 @@ if(96 to 100) //Protection Objectives (5% chance) var/datum/objective/protection/objective = PickObjectiveFromList(protectobjectives) for(1 to 10) - if(objective.points + totalweight <= 110) + if(objective.points + totalweight <= 100) break objective = PickObjectiveFromList(protectobjectives) if(!objective) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 39fb22d84e3..1bd7d9af20d 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -233,7 +233,9 @@ synd_mob.equip_if_possible(new /obj/item/ammo_magazine/a12mm(synd_mob), synd_mob.slot_in_backpack) synd_mob.equip_if_possible(new /obj/item/weapon/reagent_containers/pill/cyanide(synd_mob), synd_mob.slot_in_backpack) synd_mob.equip_if_possible(new /obj/item/weapon/gun/projectile/automatic/c20r(synd_mob), synd_mob.slot_belt) - var/obj/item/weapon/implant/dexplosive/E = new/obj/item/weapon/implant/dexplosive(synd_mob) + var/datum/organ/external/O = pick(synd_mob.organs) + var/obj/item/weapon/implant/dexplosive/E = new/obj/item/weapon/implant/dexplosive(O) + O.implant += E E.imp_in = synd_mob E.implanted = 1 diff --git a/code/game/jobs/job/captian.dm b/code/game/jobs/job/captian.dm index d570a6176ba..6e9bd017ab5 100644 --- a/code/game/jobs/job/captian.dm +++ b/code/game/jobs/job/captian.dm @@ -18,7 +18,9 @@ H.equip_if_possible(new /obj/item/clothing/head/caphat(H), H.slot_head) H.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(H), H.slot_glasses) H.equip_if_possible(new /obj/item/weapon/storage/id_kit(H), H.slot_in_backpack) - var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) + var/datum/organ/external/O = pick(H.organs) + var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(O) + O.implant += L L.imp_in = H L.implanted = 1 world << "[H.real_name] is the captain!" diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 2f4dc783ad0..57587b46372 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -23,7 +23,9 @@ H.equip_if_possible(new /obj/item/clothing/glasses/sunglasses/sechud(H), H.slot_glasses) H.equip_if_possible(new /obj/item/weapon/handcuffs(H), H.slot_in_backpack) H.equip_if_possible(new /obj/item/weapon/gun/energy/gun(H), H.slot_s_store) - var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) + var/datum/organ/external/O = pick(H.organs) + var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(O) + O.implant += L L.imp_in = H L.implanted = 1 return 1 @@ -53,7 +55,9 @@ H.equip_if_possible(new /obj/item/clothing/glasses/sunglasses/sechud(H), H.slot_glasses) H.equip_if_possible(new /obj/item/weapon/handcuffs(H), H.slot_in_backpack) H.equip_if_possible(new /obj/item/device/flash(H), H.slot_l_store) - var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) + var/datum/organ/external/O = pick(H.organs) + var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(O) + O.implant += L L.imp_in = H L.implanted = 1 return 1 @@ -92,7 +96,9 @@ H.equip_if_possible(new /obj/item/weapon/zippo(H), H.slot_l_store) // H.equip_if_possible(new /obj/item/weapon/reagent_containers/food/snacks/candy_corn(H), H.slot_h_store) // No... just no. --SkyMarshal - var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) + var/datum/organ/external/O = pick(H.organs) + var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(O) + O.implant += L L.imp_in = H L.implanted = 1 return 1 @@ -122,7 +128,9 @@ H.equip_if_possible(new /obj/item/clothing/gloves/red(H), H.slot_gloves) H.equip_if_possible(new /obj/item/weapon/handcuffs(H), H.slot_s_store) H.equip_if_possible(new /obj/item/device/flash(H), H.slot_l_store) - var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) + var/datum/organ/external/O = pick(H.organs) + var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(O) + O.implant += L L.imp_in = H L.implanted = 1 return 1 diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 253d725409a..e366238992a 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -253,7 +253,7 @@ AN = "[e.wound]:" if(e.open) open = "OPEN:" - if(e.implant) + if(e.implant && e.implant.len) imp = "IMPLANT:" if(!AN && !open && !infected & !imp) AN = "None" diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index d3a150d9ed2..a0460b9d67c 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -395,7 +395,9 @@ //Add an implant if needed var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject) if (isnull(imp)) - imp = new /obj/item/weapon/implant/health(subject) + var/datum/organ/external/O = pick(subject.organs) + imp = new /obj/item/weapon/implant/health(O) + O.implant += imp imp.implanted = subject R.fields["imp"] = "\ref[imp]" //Update it if needed diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 0a923bf1108..5b32f3a1f78 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -316,8 +316,13 @@ var // - Just display a garbled message - else heard_garbled += R - for(var/obj/item/weapon/implant/imp in R) - imp.hear(message,M) + if(hasorgans(R)) + for(var/datum/organ/external/O in R:organs) + for(var/obj/item/weapon/implant/imp in O.implant) + imp.hear(message,M) + else + for(var/obj/item/weapon/implant/imp in R) + imp.hear(message,M) /* ###### Begin formatting and sending the message ###### */ @@ -595,8 +600,13 @@ var // - Just display a garbled message - heard_garbled += R - for(var/obj/item/weapon/implant/imp in R) - imp.hear(text,M) + if(hasorgans(R)) + for(var/datum/organ/external/O in R:organs) + for(var/obj/item/weapon/implant/imp in O.implant) + imp.hear(text,M) + else + for(var/obj/item/weapon/implant/imp in R) + imp.hear(text,M) /* ###### Begin formatting and sending the message ###### */ diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index dbd6c617458..37f159ef552 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -66,7 +66,7 @@ L[tmpname] = R for (var/obj/item/weapon/implant/tracking/I in world) - if (!I.implanted || !ismob(I.loc)) + if (!I.implanted || !(istype(I.loc,/datum/organ/external) || ismob(loc))) continue else var/mob/M = I.loc 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/devices/flash.dm b/code/game/objects/devices/flash.dm index 6f3146ae993..0bcf5911300 100644 --- a/code/game/objects/devices/flash.dm +++ b/code/game/objects/devices/flash.dm @@ -49,10 +49,11 @@ if(ishuman(M) && ishuman(user)) if(user.mind in ticker.mode.head_revolutionaries) var/revsafe = 0 - for(var/obj/item/weapon/implant/loyalty/L in M) - if(L && L.implanted) - revsafe = 1 - break + for(var/datum/organ/external/O in M.organs) + for(var/obj/item/weapon/implant/loyalty/L in O.implant) + if(L && L.implanted) + revsafe = 1 + break if(M.mind.has_been_rev) revsafe = 2 if(!revsafe) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index cca25ab9d63..e22d0a9bf18 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -249,11 +249,11 @@ the implant may become unstable and either pre-maturely inject the subject or si var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "") msg = sanitize_simple(msg, replacechars) if(findtext(msg,phrase)) - if(istype(loc, /mob/)) - var/mob/T = loc + 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) @@ -284,17 +284,17 @@ the implant may become unstable and either pre-maturely inject the subject or si return dat process() - var/mob/M = src.loc - + var/mob/M = imp_in + if(isnull(M)) // If the mob got gibbed var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null) a.autosay("states, \"[mobname] has died-zzzzt in-in-in...\"", "[mobname]'s Death Alarm") 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/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index d2f37e012b2..289d6fc486d 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -60,7 +60,7 @@ Frequency: src.temp += "Extranneous Signals:
" for (var/obj/item/weapon/implant/tracking/W in world) - if (!W.implanted || !ismob(W.loc)) + if (!W.implanted || !(istype(W.loc,/datum/organ/external) || ismob(W.loc))) continue else var/mob/M = W.loc 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/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 7c02f43e8e1..562403ee830 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -107,10 +107,19 @@ break else C.images += image(tempHud,perp,"hudunknown") - for(var/obj/item/weapon/implant/I in perp) - if(I.implanted) - if(istype(I,/obj/item/weapon/implant/tracking)) - C.images += image(tempHud,perp,"hud_imp_tracking") - if(istype(I,/obj/item/weapon/implant/loyalty)) - C.images += image(tempHud,perp,"hud_imp_loyal") + if(hasorgans(perp)) + for(var/datum/organ/external/E in perp) + for(var/obj/item/weapon/implant/I in E.implant) + if(I.implanted) + if(istype(I,/obj/item/weapon/implant/tracking)) + C.images += image(tempHud,perp,"hud_imp_tracking") + if(istype(I,/obj/item/weapon/implant/loyalty)) + C.images += image(tempHud,perp,"hud_imp_loyal") + else + for(var/obj/item/weapon/implant/I in perp) + if(I.implanted) + if(istype(I,/obj/item/weapon/implant/tracking)) + C.images += image(tempHud,perp,"hud_imp_tracking") + if(istype(I,/obj/item/weapon/implant/loyalty)) + C.images += image(tempHud,perp,"hud_imp_loyal") diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index bb3507561d5..664db918a0e 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -9,9 +9,11 @@ var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle) //var/m_type = 1 - for (var/obj/item/weapon/implant/I in src) - if (I.implanted) - I.trigger(act, src) + for(var/named in organs) + var/datum/organ/external/F = organs[named] + for (var/obj/item/weapon/implant/I in F.implant) + if (I.implanted) + I.trigger(act, src) if(src.stat == 2.0 && (act != "deathgasp")) return 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/living/say.dm b/code/modules/mob/living/say.dm index d59ae496a26..dabef32f656 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -347,11 +347,12 @@ for (var/mob/M in W) W |= M.contents - if(ishuman(M)) - var/mob/living/carbon/human/G = M - for(var/name in G.organs) - var/datum/organ/external/F = G.organs[name] - W |= F.implant + if(hasorgans(M)) + var/mob/living/carbon/G = M + for(var/name in G:organs) + var/datum/organ/external/F = G:organs[name] + for(var/obj/item/weapon/implant/I in F.implant) + W |= I for (var/obj/item/device/pda/M in W) W |= M.contents diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 39cab8d3c98..50b349f03c7 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -711,7 +711,7 @@ if (isbanned) log_access("Failed Login: [src] - Banned") message_admins("\blue Failed Login: [src] - Banned") - alert(src,"You have been banned.\nReason : [isbanned]","Ban","Ok") + alert(src,"You have been banned.\nReason : [isbanned][config.appeal_address ? "\nYou may appeal this at [config.appeal_address]" : ""]","Ban","Ok") del(src) /* 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) diff --git a/config/config.txt b/config/config.txt index 912e5e5c527..ee4fb259554 100644 --- a/config/config.txt +++ b/config/config.txt @@ -111,4 +111,7 @@ GUEST_JOBBAN 1 # FEATURE_OBJECT_SPELL_SYSTEM ##Toggle for having jobs load up from the .txt -# LOAD_JOBS_FROM_TXT \ No newline at end of file +# LOAD_JOBS_FROM_TXT + +##What address should banned people appeal ther ban at? Remember to escape the characters, if needed! +# APPEAL_ADDRESS -->APPEAL ADDRESS HERE<-- \ No newline at end of file