From 757d4a66beeefecfc41e920841250795064bad4c Mon Sep 17 00:00:00 2001 From: fludd12 Date: Thu, 23 Mar 2017 19:44:33 -0400 Subject: [PATCH 01/41] Redoes everything --- code/__HELPERS/text.dm | 30 +++++----- code/game/dna/genes/vg_powers.dm | 11 ++-- .../mob/living/carbon/human/human_defense.dm | 3 + .../reagents/chemistry/reagents/water.dm | 57 ++++++++++++++++++- 4 files changed, 80 insertions(+), 21 deletions(-) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 89755d7acf0..864fc094286 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -448,32 +448,32 @@ proc/checkhtml(var/t) // Pencode -/proc/pencode_to_html(text, mob/user, obj/item/weapon/pen/P = null, sign = 1, fields = 1, deffont = PEN_FONT, signfont = SIGNFONT, crayonfont = CRAYON_FONT) - text = replacetext(text, "\n", "
") - text = replacetext(text, "\[center\]", "
") - text = replacetext(text, "\[/center\]", "
") - text = replacetext(text, "\[br\]", "
") +/proc/pencode_to_html(text, mob/user, obj/item/weapon/pen/P = null, format = 1, sign = 1, fields = 1, deffont = PEN_FONT, signfont = SIGNFONT, crayonfont = CRAYON_FONT) text = replacetext(text, "\[b\]", "") text = replacetext(text, "\[/b\]", "") text = replacetext(text, "\[i\]", "") text = replacetext(text, "\[/i\]", "") text = replacetext(text, "\[u\]", "") text = replacetext(text, "\[/u\]", "") - text = replacetext(text, "\[large\]", "") - text = replacetext(text, "\[/large\]", "") if(sign) text = replacetext(text, "\[sign\]", "[user ? user.real_name : "Anonymous"]") if(fields) text = replacetext(text, "\[field\]", "") + if(format) + text = replacetext(text, "\[h1\]", "

") + text = replacetext(text, "\[/h1\]", "

") + text = replacetext(text, "\[h2\]", "

") + text = replacetext(text, "\[/h2\]", "

") + text = replacetext(text, "\[h3\]", "

") + text = replacetext(text, "\[/h3\]", "

") + text = replacetext(text, "\n", "
") + text = replacetext(text, "\[center\]", "
") + text = replacetext(text, "\[/center\]", "
") + text = replacetext(text, "\[br\]", "
") + text = replacetext(text, "\[large\]", "") + text = replacetext(text, "\[/large\]", "") - text = replacetext(text, "\[h1\]", "

") - text = replacetext(text, "\[/h1\]", "

") - text = replacetext(text, "\[h2\]", "

") - text = replacetext(text, "\[/h2\]", "

") - text = replacetext(text, "\[h3\]", "

") - text = replacetext(text, "\[/h3\]", "

") - - if(istype(P, /obj/item/toy/crayon)) // If it is a crayon, and he still tries to use these, make them empty! + if(istype(P, /obj/item/toy/crayon) | !format) // If it is a crayon, and he still tries to use these, make them empty! text = replacetext(text, "\[*\]", "") text = replacetext(text, "\[hr\]", "") text = replacetext(text, "\[small\]", "") diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index e159aa44247..0a336695082 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -211,11 +211,11 @@ /obj/effect/proc_holder/spell/targeted/remotetalk/choose_targets(mob/user = usr) var/list/targets = new /list() var/list/validtargets = new /list() - for(var/mob/M in view(user.client.view, user)) + var/turf/T = get_turf(user) + for(var/mob/M in range(14, T)) if(M && M.mind) if(M == user) continue - validtargets += M if(!validtargets.len) @@ -237,14 +237,15 @@ if(!say) return say = strip_html(say) + say = pencode_to_html(say, usr, format = 0, fields = 0 for(var/mob/living/target in targets) log_say("Project Mind: [key_name(user)]->[key_name(target)]: [say]") if(REMOTE_TALK in target.mutations) - target.show_message("You hear [user.real_name]'s voice: [say]") + target.show_message("You hear [user.real_name]'s voice: [say]") else - target.show_message("You hear a voice that seems to echo around the room: [say]") - user.show_message("You project your mind into [target.real_name]: [say]") + target.show_message("You hear a voice that seems to echo around the room: [say]") + user.show_message("You project your mind into [target.real_name]: [say]") for(var/mob/dead/observer/G in player_list) G.show_message("Telepathic message from [user] ([ghost_follow_link(user, ghost=G)]) to [target] ([ghost_follow_link(target, ghost=G)]): [say]") diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 3f25873e5f2..c4b9540d899 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -471,3 +471,6 @@ emp_act ..() if(temperature >= 330) bodytemperature = bodytemperature + (temperature - bodytemperature) if(temperature <= 280) bodytemperature = bodytemperature - (bodytemperature - temperature) + if(get_species() == "Grey") + take_organ_damage(5,min(volume,20)) + emote("scream") diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm index 70d2a9f76c0..773d03c6006 100644 --- a/code/modules/reagents/chemistry/reagents/water.dm +++ b/code/modules/reagents/chemistry/reagents/water.dm @@ -20,10 +20,65 @@ drink_desc = "The father of all refreshments." /datum/reagent/water/reaction_mob(mob/living/M, method=TOUCH, volume) -// Put out fire if(method == TOUCH) + // Put out fire M.adjust_fire_stacks(-(volume / 10)) M.ExtinguishMob() + if(ishuman(M)) + + var/mob/living/carbon/human/H = M + + if(H.get_species() != "Grey") //God this is so gross I hate it. + return + + if(volume > 25) + + if(H.wear_mask) + to_chat(H, "Your mask protects you from the water!") + return + + if(H.head) + to_chat(H, "Your helmet protects you from the water!") + return + + if(!M.unacidable) + if(prob(75)) + var/obj/item/organ/external/affecting = H.get_organ("head") + if(affecting) + affecting.take_damage(5, 10) + H.UpdateDamageIcon() + H.emote("scream") + else + M.take_organ_damage(5,10) + else + M.take_organ_damage(5,10) + + if(method == INGEST) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + + if(H.get_species() != "Grey") + return + + if(volume < 10) + to_chat(M, "The watery solvent substance stings you, but isn't concentrated enough to harm you!") + + if(volume >=10 && volume <=25) + if(!H.unacidable) + M.take_organ_damage(0,min(max(volume-10,2)*2,20)) + M.emote("scream") + + + if(volume > 25) + if(!M.unacidable) + if(prob(75)) + var/obj/item/organ/external/affecting = H.get_organ("head") + if(affecting) + affecting.take_damage(0, 20) + H.UpdateDamageIcon() + H.emote("scream") + else + M.take_organ_damage(0,20) /datum/reagent/water/reaction_turf(turf/simulated/T, volume) if(!istype(T)) From 05eceb85d1c60a49421da9c56526c71d25c19cc0 Mon Sep 17 00:00:00 2001 From: fludd12 Date: Thu, 23 Mar 2017 19:47:44 -0400 Subject: [PATCH 02/41] A single missing parenthesis managed to make every single file in all of code/modules return an error. --- code/game/dna/genes/vg_powers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index 0a336695082..3a05ae02e38 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -237,7 +237,7 @@ if(!say) return say = strip_html(say) - say = pencode_to_html(say, usr, format = 0, fields = 0 + say = pencode_to_html(say, usr, format = 0, fields = 0) for(var/mob/living/target in targets) log_say("Project Mind: [key_name(user)]->[key_name(target)]: [say]") From 247ba05ce55ec501b80c5a82f711e77b465ecc3c Mon Sep 17 00:00:00 2001 From: fludd12 Date: Thu, 23 Mar 2017 21:09:29 -0400 Subject: [PATCH 03/41] Finishes everything probably --- code/__HELPERS/text.dm | 9 +++++---- code/modules/mob/language.dm | 21 ++++++++++++++++++++- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 864fc094286..f9bae78c35b 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -473,7 +473,7 @@ proc/checkhtml(var/t) text = replacetext(text, "\[large\]", "") text = replacetext(text, "\[/large\]", "") - if(istype(P, /obj/item/toy/crayon) | !format) // If it is a crayon, and he still tries to use these, make them empty! + if(istype(P, /obj/item/toy/crayon) || !format) // If it is a crayon, and he still tries to use these, make them empty! text = replacetext(text, "\[*\]", "") text = replacetext(text, "\[hr\]", "") text = replacetext(text, "\[small\]", "") @@ -485,7 +485,7 @@ proc/checkhtml(var/t) text = replacetext(text, "\[row\]", "") text = replacetext(text, "\[cell\]", "") text = replacetext(text, "\[logo\]", "") - + if(istype(P, /obj/item/toy/crayon)) text = "[text]" else // They are using "not a crayon" - formatting is OK and such text = replacetext(text, "\[*\]", "
  • ") @@ -501,9 +501,10 @@ proc/checkhtml(var/t) text = replacetext(text, "\[row\]", "") text = replacetext(text, "\[cell\]", "") text = replacetext(text, "\[logo\]", "") - + if(P) text = "[text]" - + else + text = "[text]" text = copytext(text, 1, MAX_PAPER_MESSAGE_LEN) return text diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index fb6d5ef5948..01fe5f43cc9 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -96,6 +96,9 @@ return (copytext(message, length(message)) == "!") ? 2 : 1 /datum/language/proc/broadcast(mob/living/speaker, message, speaker_mask) + if(!check_can_speak(speaker)) + return FALSE + log_say("[key_name(speaker)]: ([name]) [message]") if(!speaker_mask) @@ -114,6 +117,9 @@ /datum/language/proc/check_special_condition(mob/other, mob/living/speaker) return TRUE +/datum/language/proc/check_can_speak(mob/living/speaker) + return TRUE + /datum/language/proc/get_spoken_verb(msg_end) switch(msg_end) if("!") @@ -292,8 +298,21 @@ /datum/language/grey/broadcast(mob/living/speaker, message, speaker_mask) ..(speaker,message,speaker.real_name) +/datum/language/grey/check_can_speak(mob/living/speaker) + if(ishuman(speaker)) + var/mob/living/carbon/human/spkr = speaker + var/obj/item/organ/external/rhand = spkr.organs_by_name["r_hand"] + var/obj/item/organ/external/lhand = spkr.organs_by_name["l_hand"] + if((!rhand || !rhand.is_usable()) && (!lhand || !lhand.is_usable())) + to_chat(speaker,"You can't communicate without the ability to use your hands!") + return FALSE + if(speaker.incapacitated(ignore_lying = 1)) + to_chat(speaker,"You can't communicate while unable to move your hands to your head!") + return FALSE + return TRUE + /datum/language/grey/check_special_condition(mob/living/carbon/human/other, mob/living/carbon/human/speaker) - if(other in range(7, speaker)) + if(other.z == speaker.z) return TRUE return FALSE From 19db4147ffee1501c89776103dc36e823b89f792 Mon Sep 17 00:00:00 2001 From: fludd12 Date: Thu, 23 Mar 2017 21:56:36 -0400 Subject: [PATCH 04/41] Finalizes the re-do of my language changes. --- code/modules/mob/language.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 01fe5f43cc9..8a278a026e9 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -296,6 +296,13 @@ flags = RESTRICTED | HIVEMIND /datum/language/grey/broadcast(mob/living/speaker, message, speaker_mask) + var/their = "their" + if(speaker.gender == "female") + their = "her" + if(speaker.gender == "male") + their = "his" + for(var/mob/living/player in view(4, speaker)) + to_chat(player,"[speaker] touches [their] fingers to [their] temple.") ..(speaker,message,speaker.real_name) /datum/language/grey/check_can_speak(mob/living/speaker) From 67665d76cf475c4a3eca4385e39612e65a788bb3 Mon Sep 17 00:00:00 2001 From: fludd12 Date: Tue, 28 Mar 2017 23:48:07 -0400 Subject: [PATCH 05/41] Fixes two things Hopefully last fix Revert "Hopefully last fix" This reverts commit 91550ad5abb256d3d868459393073a4bd74b7241. Fixes two things --- code/game/dna/genes/vg_powers.dm | 2 +- code/modules/mob/language.dm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index 3a05ae02e38..32a6a58cbb3 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -245,7 +245,7 @@ target.show_message("You hear [user.real_name]'s voice: [say]") else target.show_message("You hear a voice that seems to echo around the room: [say]") - user.show_message("You project your mind into [target.real_name]: [say]") + user.show_message("You project your mind into [target.name]: [say]") for(var/mob/dead/observer/G in player_list) G.show_message("Telepathic message from [user] ([ghost_follow_link(user, ghost=G)]) to [target] ([ghost_follow_link(target, ghost=G)]): [say]") diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 8a278a026e9..bbf840f7b3f 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -301,8 +301,8 @@ their = "her" if(speaker.gender == "male") their = "his" - for(var/mob/living/player in view(4, speaker)) - to_chat(player,"[speaker] touches [their] fingers to [their] temple.") + + speaker.visible_message("[speaker] touches [their] fingers to [their] temple.") ..(speaker,message,speaker.real_name) /datum/language/grey/check_can_speak(mob/living/speaker) From 9d74b9090aa11ba6d4b5297e388ecbd580837c50 Mon Sep 17 00:00:00 2001 From: fludd12 Date: Tue, 16 May 2017 23:51:37 -0400 Subject: [PATCH 06/41] Last fix, I hope --- code/modules/mob/language.dm | 8 ++++---- .../file_system/programs/generic/file_browser.dm | 2 +- code/modules/paperwork/paper.dm | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index bbf840f7b3f..7bd393412a8 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -307,9 +307,9 @@ /datum/language/grey/check_can_speak(mob/living/speaker) if(ishuman(speaker)) - var/mob/living/carbon/human/spkr = speaker - var/obj/item/organ/external/rhand = spkr.organs_by_name["r_hand"] - var/obj/item/organ/external/lhand = spkr.organs_by_name["l_hand"] + var/mob/living/carbon/human/S = speaker + var/obj/item/organ/external/rhand = S.get_organ("r_hand") + var/obj/item/organ/external/lhand = S.get_organ("l_hand") if((!rhand || !rhand.is_usable()) && (!lhand || !lhand.is_usable())) to_chat(speaker,"You can't communicate without the ability to use your hands!") return FALSE @@ -319,7 +319,7 @@ return TRUE /datum/language/grey/check_special_condition(mob/living/carbon/human/other, mob/living/carbon/human/speaker) - if(other.z == speaker.z) + if(atoms_share_level(other, speaker)) return TRUE return FALSE diff --git a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm index 20c4e92fd98..a868c0958ea 100644 --- a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm @@ -43,7 +43,7 @@ if(!istype(file)) data["error"] = "I/O ERROR: Unable to open file." else - data["filedata"] = pencode_to_html(file.stored_data, sign = 0, fields = 0) + data["filedata"] = pencode_to_html(file.stored_data, format = 1, sign = 0, fields = 0) data["filename"] = "[file.filename].[file.filetype]" else if(!computer || !HDD) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 60a501f1ecf..f82d2bc0b1e 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -203,7 +203,7 @@ /obj/item/weapon/paper/proc/parsepencode(var/t, var/obj/item/weapon/pen/P, mob/user as mob) - t = pencode_to_html(t, usr, P, TRUE, TRUE, deffont, signfont, crayonfont) + t = pencode_to_html(t, usr, P, TRUE, TRUE, TRUE, deffont, signfont, crayonfont) //Count the fields var/laststart = 1 From 166c79d86a9d76880936ce6e3cce8636c9013d62 Mon Sep 17 00:00:00 2001 From: fludd12 Date: Wed, 31 May 2017 15:53:24 -0400 Subject: [PATCH 07/41] makes a species water_act --- code/modules/mob/living/carbon/human/human_defense.dm | 5 ++--- code/modules/mob/living/carbon/human/species/species.dm | 3 +++ code/modules/mob/living/carbon/human/species/station.dm | 5 +++++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index c4b9540d899..9e8fcf8d50b 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -471,6 +471,5 @@ emp_act ..() if(temperature >= 330) bodytemperature = bodytemperature + (temperature - bodytemperature) if(temperature <= 280) bodytemperature = bodytemperature - (bodytemperature - temperature) - if(get_species() == "Grey") - take_organ_damage(5,min(volume,20)) - emote("scream") + species.water_act(src,volume,temperature,source) + diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index d2d44757705..ccaff68fec7 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -677,3 +677,6 @@ It'll return null if the organ doesn't correspond, so include null checks when u if(H.see_override) //Override all H.see_invisible = H.see_override + +/datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source) + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index c1005f2b932..9355f5b38ec 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -750,6 +750,11 @@ genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED) ..() +/datum/species/grey/water_act(var/mob/living/carbon/C, volume, temperature, source) + C.take_organ_damage(5,min(volume,20)) + C.emote("scream") + ..() + /datum/species/grey/after_equip_job(datum/job/J, mob/living/carbon/human/H) var/speech_pref = H.client.prefs.speciesprefs if(speech_pref) From 5807cd69c023cff02df94a2cf18b812d021860ab Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 3 Jun 2017 21:47:14 +0100 Subject: [PATCH 08/41] Add sentience event --- code/modules/events/event_container.dm | 1 + code/modules/events/sentience.dm | 32 ++++++++++++++++++++++++++ paradise.dme | 1 + 3 files changed, 34 insertions(+) create mode 100644 code/modules/events/sentience.dm diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 98fe9fad27f..8b98dac200d 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -137,6 +137,7 @@ var/list/event_last_fired = list() new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Sentience", /datum/event/sentience, 50), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)) ) diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm new file mode 100644 index 00000000000..114f30c0fb2 --- /dev/null +++ b/code/modules/events/sentience.dm @@ -0,0 +1,32 @@ +/datum/event/sentience + +/datum/event/sentience/start() + var/ghostmsg = "Do you want to awaken as a sentient being?" + var/list/candidates = pollCandidates(ghostmsg, ROLE_SENTIENT, 1) + var/list/potential = list() + for(var/mob/living/simple_animal/L in living_mob_list) + var/turf/T = get_turf(L) + if (T.z != 1) + continue + if(!(L in player_list) && !L.mind) + potential += L + + var/mob/living/simple_animal/SA = pick(potential) + var/mob/living/simple_animal/SG = pick(candidates) + + if(!SA || !SG) //if you can't find either a simple animal or a player, end + return FALSE + + SA.key = SG.key + SA.universal_speak = 1 + SA.sentience_act() + SA.maxHealth = max(SA.maxHealth, 200) + SA.health = SA.maxHealth + SA.del_on_death = FALSE + greet_sentient(SA) + +/datum/event/sentience/proc/greet_sentient(var/mob/living/carbon/human/M) + to_chat(M, "Hello world!") + to_chat(M, "Due to freak radiation, you have gained \ + human level intelligence and the ability to speak and understand \ + and the ability to speak and understand human language!") diff --git a/paradise.dme b/paradise.dme index 869bffe601b..20318ef2db6 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1285,6 +1285,7 @@ #include "code\modules\events\prison_break.dm" #include "code\modules\events\radiation_storm.dm" #include "code\modules\events\rogue_drones.dm" +#include "code\modules\events\sentience.dm" #include "code\modules\events\slaughterevent.dm" #include "code\modules\events\spacevine.dm" #include "code\modules\events\spider_infestation.dm" From 6da7035973b669d9ea3e00e8020777ac64b95b8f Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 3 Jun 2017 22:24:06 +0100 Subject: [PATCH 09/41] Fixes errata in the text --- code/modules/events/sentience.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index 114f30c0fb2..5dee712e072 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -29,4 +29,4 @@ to_chat(M, "Hello world!") to_chat(M, "Due to freak radiation, you have gained \ human level intelligence and the ability to speak and understand \ - and the ability to speak and understand human language!") + human language!") From 0a0b0430e138c07c008f6aa9d9d982dfd2151055 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 3 Jun 2017 23:07:34 +0100 Subject: [PATCH 10/41] ghosts aren't simple animals, who knew? --- code/modules/events/sentience.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index 5dee712e072..4a1b44700e3 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -12,7 +12,7 @@ potential += L var/mob/living/simple_animal/SA = pick(potential) - var/mob/living/simple_animal/SG = pick(candidates) + var/mob/SG = pick(candidates) if(!SA || !SG) //if you can't find either a simple animal or a player, end return FALSE From 0daf8a6a7ff5ff64a4bf912315b7c5ed1805367f Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 5 Jun 2017 16:37:21 -0400 Subject: [PATCH 11/41] Object Embedding --- code/__DEFINES/combat.dm | 11 ++ code/__DEFINES/is_helpers.dm | 12 +- code/__HELPERS/unsorted.dm | 33 +++--- code/datums/spells/summonitem.dm | 8 ++ .../gamemodes/changeling/powers/revive.dm | 5 +- code/game/gamemodes/miniantags/borer/borer.dm | 10 -- code/game/gamemodes/wizard/artefact.dm | 2 +- code/game/machinery/adv_med.dm | 4 +- code/game/objects/items.dm | 11 ++ code/game/objects/items/latexballoon.dm | 2 +- code/game/objects/items/policetape.dm | 2 +- code/game/objects/structures/inflatable.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 4 + code/modules/mob/living/carbon/human/death.dm | 23 +--- .../mob/living/carbon/human/examine.dm | 6 +- code/modules/mob/living/carbon/human/human.dm | 56 ++++----- .../mob/living/carbon/human/human_defense.dm | 55 +++------ code/modules/mob/living/carbon/human/life.dm | 27 +++-- .../living/carbon/human/species/species.dm | 3 - code/modules/mob/living/living.dm | 1 + code/modules/mob/mob.dm | 98 ---------------- code/modules/mob/mob_defines.dm | 3 +- code/modules/surgery/implant.dm | 110 +----------------- code/modules/surgery/organs/organ_external.dm | 52 +++++---- .../modules/surgery/remove_embedded_object.dm | 42 +++++++ paradise.dme | 1 + 26 files changed, 215 insertions(+), 368 deletions(-) create mode 100644 code/modules/surgery/remove_embedded_object.dm diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 499be494056..71c6bac6979 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -63,6 +63,17 @@ #define THROWN_PROJECTILE_ATTACK 4 #define LEAP_ATTACK 5 +//Embedded objects +#define EMBEDDED_PAIN_CHANCE 15 //Chance for embedded objects to cause pain (damage user) +#define EMBEDDED_ITEM_FALLOUT 5 //Chance for embedded object to fall out (causing pain but removing the object) +#define EMBED_CHANCE 45 //Chance for an object to embed into somebody when thrown (if it's sharp) +#define EMBEDDED_PAIN_MULTIPLIER 2 //Coefficient of multiplication for the damage the item does while embedded (this*item.w_class) +#define EMBEDDED_FALL_PAIN_MULTIPLIER 5 //Coefficient of multiplication for the damage the item does when it falls out (this*item.w_class) +#define EMBEDDED_IMPACT_PAIN_MULTIPLIER 4 //Coefficient of multiplication for the damage the item does when it first embeds (this*item.w_class) +#define EMBED_THROWSPEED_THRESHOLD 4 //The minimum value of an item's throw_speed for it to embed (Unless it has embedded_ignore_throwspeed_threshold set to 1) +#define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 8 //Coefficient of multiplication for the damage the item does when removed without a surgery (this*item.w_class) +#define EMBEDDED_UNSAFE_REMOVAL_TIME 30 //A Time in ticks, total removal time = (this*item.w_class) + //Gun Stuff #define SAWN_INTACT 0 #define SAWN_OFF 1 diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index a27e3f8e96a..d708813b139 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -2,9 +2,19 @@ #define isatom(A) istype(A, /atom) #define ismovableatom(A) istype(A, /atom/movable) -// Mobs +// Mobs #define ismegafauna(A) istype(A, /mob/living/simple_animal/hostile/megafauna) +//Objects + +var/list/static/global/pointed_types = typecacheof(list( + /obj/item/weapon/pen, + /obj/item/weapon/screwdriver, + /obj/item/weapon/reagent_containers/syringe, + /obj/item/weapon/kitchen/utensil/fork)) + +#define is_pointed(W) (is_type_in_typecache(W, pointed_types)) + //Turfs #define issimulatedturf(A) istype(A, /turf/simulated) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 82b2ea8b419..c90db77effb 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1081,6 +1081,21 @@ proc/get_mob_with_client_list() return get_turf(location) +//For objects that should embed, but make no sense being is_sharp or is_pointed() +//e.g: rods +var/list/can_embed_types = typecacheof(list( + /obj/item/stack/rods, + /obj/item/pipe)) + +/proc/can_embed(obj/item/W) + if(is_sharp(W)) + return 1 + if(is_pointed(W)) + return 1 + + if(is_type_in_typecache(W, can_embed_types)) + return 1 + //Quick type checks for some tools var/global/list/common_tools = list( /obj/item/stack/cable_coil, @@ -1199,22 +1214,6 @@ var/global/list/common_tools = list( if(O.edge) return 1 return 0 -//Returns 1 if the given item is capable of popping things like balloons, inflatable barriers, or cutting police tape. -/proc/can_puncture(obj/item/W as obj) // For the record, WHAT THE HELL IS THIS METHOD OF DOING IT? - if(!istype(W)) return 0 - if(!W) return 0 - if(W.sharp) return 1 - return ( \ - W.sharp || \ - istype(W, /obj/item/weapon/screwdriver) || \ - istype(W, /obj/item/weapon/pen) || \ - istype(W, /obj/item/weapon/weldingtool) || \ - istype(W, /obj/item/weapon/lighter/zippo) || \ - istype(W, /obj/item/weapon/match) || \ - istype(W, /obj/item/clothing/mask/cigarette) || \ - istype(W, /obj/item/weapon/shovel) \ - ) - /proc/is_surgery_tool(obj/item/W as obj) return ( \ istype(W, /obj/item/weapon/scalpel) || \ @@ -1891,4 +1890,4 @@ var/global/list/g_fancy_list_of_types = null var/num = pick(num_sample) num_sample -= num result += (1 << num) - return result + return result diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm index 32472fe1ec0..bb650eb17f9 100644 --- a/code/datums/spells/summonitem.dm +++ b/code/datums/spells/summonitem.dm @@ -79,6 +79,14 @@ add_logs(target, C, "magically debrained", addition="INTENT: [uppertext(target.a_intent)]")*/ if(C.stomach_contents && item_to_retrive in C.stomach_contents) C.stomach_contents -= item_to_retrive + for(var/X in C.bodyparts) + var/obj/item/organ/external/part = X + if(item_to_retrive in part.embedded_objects) + part.embedded_objects -= item_to_retrive + to_chat(C, "The [item_to_retrive] that was embedded in your [part] has myseriously vanished. How fortunate!") + if(!C.has_embedded_objects()) + C.clear_alert("embeddedobject") + break else if(istype(item_to_retrive.loc,/obj/machinery/portable_atmospherics/)) //Edge cases for moved machinery diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 5fd98986332..9077f623a2c 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -39,10 +39,6 @@ var/obj/item/organ/external/O = H.bodyparts_by_name[organ_name] if(!O) continue - for(var/obj/item/weapon/shard/shrapnel/s in O.implants) - O.implants -= s - H.contents -= s - qdel(s) O.brute_dam = 0 O.burn_dam = 0 O.damage_state = "00" @@ -58,6 +54,7 @@ for(var/obj/item/organ/internal/IO in H.internal_organs) IO.damage = 0 IO.trace_chemicals.Cut() + H.remove_all_embedded_objects() H.updatehealth() to_chat(user, "We have regenerated.") diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index ea92b93f473..77a0803a706 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -361,11 +361,6 @@ host = M forceMove(M) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/external/head = H.get_organ("head") - head.implants += src - host.status_flags |= PASSEMOTES RemoveBorerActions() @@ -746,11 +741,6 @@ controlling = FALSE - if(ishuman(host)) - var/mob/living/carbon/human/H = host - var/obj/item/organ/external/head = H.get_organ("head") - head.implants -= src - reset_perspective(null) machine = null diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 1dd20906704..8e635e5d027 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -780,7 +780,7 @@ var/global/list/multiverse = list() to_chat(target, "You suddenly feel very hot") target.bodytemperature += 50 GiveHint(target) - else if(can_puncture(I)) + else if(is_pointed(I)) to_chat(target, "You feel a stabbing pain in [parse_zone(user.zone_sel.selecting)]!") target.Weaken(2) GiveHint(target) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 41dc37ab43f..6d7264e9256 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -398,7 +398,7 @@ organData["broken"] = E.min_broken_damage var/shrapnelData[0] - for(var/obj/I in E.implants) + for(var/obj/I in E.embedded_objects) var/shrapnelSubData[0] shrapnelSubData["name"] = I.name @@ -605,7 +605,7 @@ infected = "Septic:" var/unknown_body = 0 - for(var/I in e.implants) + for(var/I in e.embedded_objects) unknown_body++ if(unknown_body || e.hidden) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 00eb1bd6884..469dcd1863a 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -63,6 +63,17 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/mob/thrownby = null + //So items can have custom embedd values + //Because customisation is king + var/embed_chance = EMBED_CHANCE + var/embedded_fall_chance = EMBEDDED_ITEM_FALLOUT + var/embedded_pain_chance = EMBEDDED_PAIN_CHANCE + var/embedded_pain_multiplier = EMBEDDED_PAIN_MULTIPLIER //The coefficient of multiplication for the damage this item does while embedded (this*w_class) + var/embedded_fall_pain_multiplier = EMBEDDED_FALL_PAIN_MULTIPLIER //The coefficient of multiplication for the damage this item does when falling out of a limb (this*w_class) + var/embedded_impact_pain_multiplier = EMBEDDED_IMPACT_PAIN_MULTIPLIER //The coefficient of multiplication for the damage this item does when first embedded (this*w_class) + var/embedded_unsafe_removal_pain_multiplier = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER //The coefficient of multiplication for the damage removing this without surgery causes (this*w_class) + var/embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME //A time in ticks, multiplied by the w_class. + var/toolspeed = 1 // If this item is a tool, the speed multiplier /* Species-specific sprites, concept stolen from Paradise//vg/. diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm index 5f55a5acdcc..dccc8f041f6 100644 --- a/code/game/objects/items/latexballoon.dm +++ b/code/game/objects/items/latexballoon.dm @@ -59,5 +59,5 @@ var/obj/item/weapon/tank/T = W blow(T, user) return - if(is_sharp(W) || is_hot(W) || can_puncture(W)) + if(is_sharp(W) || is_hot(W) || is_pointed(W)) burst() diff --git a/code/game/objects/items/policetape.dm b/code/game/objects/items/policetape.dm index 127f3f82c41..31da04bc799 100644 --- a/code/game/objects/items/policetape.dm +++ b/code/game/objects/items/policetape.dm @@ -174,7 +174,7 @@ var/list/tape_roll_applications = list() breaktape(/obj/item/weapon/wirecutters,user) /obj/item/tape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob) - if(user.a_intent == I_HELP && ((!can_puncture(W) && src.allowed(user)))) + if(user.a_intent == I_HELP && ((!is_pointed(W) && src.allowed(user)))) to_chat(user, "You can't break the [src] with that!") return user.visible_message("[user] breaks the [src]!", "You break the [src]!") diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 14f1357af87..2cdcfc18376 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -96,7 +96,7 @@ /obj/structure/inflatable/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(!istype(W)) return - if(can_puncture(W)) + if(is_pointed(W)) visible_message("[user] pierces [src] with [W]!") deflate(1) if(W.damtype == BRUTE || W.damtype == BURN) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 141d760287a..eb17146192c 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -244,6 +244,10 @@ if(status == "") status = "OK" src.show_message(text("\t []My [] is [].",status=="OK"?"":"",org.name,status),1) + + for(var/obj/item/I in org.embedded_objects) + to_chat(src, "\t There is \a [I] embedded in your [org.name]!") + if(staminaloss) if(staminaloss > 30) to_chat(src, "You're completely exhausted.") diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 69e86de81e6..e2d44bfba5c 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -90,8 +90,10 @@ if(src) qdel(src) /mob/living/carbon/human/death(gibbed) - if(stat == DEAD) return - if(healths) healths.icon_state = "health5" + if(stat == DEAD) + return + if(healths) + healths.icon_state = "health5" if(!gibbed) emote("deathgasp") //let the world KNOW WE ARE DEAD @@ -102,21 +104,8 @@ set_heartattack(FALSE) //Handle species-specific deaths. - if(species) species.handle_death(src) - - //Handle brain slugs. - var/obj/item/organ/external/head = get_organ("head") - var/mob/living/simple_animal/borer/B - - if(istype(head)) - for(var/I in head.implants) - if(istype(I,/mob/living/simple_animal/borer)) - B = I - if(B) - if(B.controlling && B.host == src) - B.detach() - - verbs -= /mob/living/carbon/proc/release_control + if(species) + species.handle_death(src) callHook("death", list(src, gibbed)) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 693973ab42d..2215df8d3f4 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -382,6 +382,9 @@ else wound_flavor_text["[temp.limb_name]"] = "" + for(var/obj/item/I in temp.embedded_objects) + msg += "[t_He] [t_has] \a \icon[I] [I] embedded in [t_his] [temp.name]!\n" + //Handles the text strings being added to the actual description. //If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext. var/display_chest = 0 @@ -438,9 +441,6 @@ if(display_gloves) msg += "[src] has blood running from under [t_his] gloves!\n" - - for(var/implant in get_visible_implants(0)) - msg += "[src] has \a [implant] sticking out of [t_his] flesh!\n" if(digitalcamo) msg += "[t_He] [t_is] repulsively uncanny!\n" if(!(skipface || ( wear_mask && ( wear_mask.flags_inv & HIDEFACE || wear_mask.flags_cover & MASKCOVERSMOUTH) ) ) && is_thrall(src) && in_range(user,src)) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 000a7a52bd0..3a233c869db 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -8,7 +8,6 @@ //why are these here and not in human_defines.dm //var/list/hud_list[10] var/datum/species/species //Contains icon generation and language information, set during New(). - var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call. /mob/living/carbon/human/New(var/new_loc, var/new_species = null, var/delay_ready_dna = 0) @@ -700,6 +699,28 @@ if(G && G.pickpocket) thief_mode = 1 + if(href_list["embedded_object"]) + var/obj/item/organ/external/L = locate(href_list["embedded_limb"]) in bodyparts + if(!L) + return + var/obj/item/I = locate(href_list["embedded_object"]) in L.embedded_objects + if(!I || I.loc != src) //no item, no limb, or item is not in limb or in the person anymore + return + var/time_taken = I.embedded_unsafe_removal_time*I.w_class + usr.visible_message("[usr] attempts to remove [I] from their [L.name].","You attempt to remove [I] from your [L.name]... (It will take [time_taken/10] seconds.)") + if(do_after(usr, time_taken, needhand = 1, target = src)) + if(!I || !L || I.loc != src || !(I in L.embedded_objects)) + return + L.embedded_objects -= I + L.receive_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus. + I.forceMove(get_turf(src)) + usr.put_in_hands(I) + usr.emote("scream") + usr.visible_message("[usr] successfully rips [I] out of their [L.name]!","You successfully remove [I] from your [L.name].") + if(!has_embedded_objects()) + clear_alert("embeddedobject") + return + if(href_list["item"]) var/slot = text2num(href_list["item"]) if(slot in check_obscured_slots()) @@ -1348,16 +1369,6 @@ else ..() -/mob/living/carbon/human/get_visible_implants(var/class = 0) - - var/list/visible_implants = list() - for(var/obj/item/organ/external/organ in bodyparts) - for(var/obj/item/weapon/O in organ.implants) - if(!istype(O,/obj/item/weapon/implant) && (O.w_class > class) && !istype(O,/obj/item/weapon/shard/shrapnel)) - visible_implants += O - - return(visible_implants) - /mob/living/carbon/human/generate_name() name = species.makeName(gender,src) real_name = name @@ -1365,29 +1376,6 @@ dna.real_name = name return name -/mob/living/carbon/human/proc/handle_embedded_objects() - - for(var/obj/item/organ/external/organ in bodyparts) - if(organ.status & ORGAN_SPLINTED) //Splints prevent movement. - continue - for(var/obj/item/weapon/O in organ.implants) - if(!istype(O,/obj/item/weapon/implant) && prob(5)) //Moving with things stuck in you could be bad. - // All kinds of embedded objects cause bleeding. - var/msg = null - switch(rand(1,3)) - if(1) - msg ="A spike of pain jolts your [organ.name] as you bump [O] inside." - if(2) - msg ="Your movement jostles [O] in your [organ.name] painfully." - if(3) - msg ="[O] in your [organ.name] twists painfully as you move." - to_chat(src, msg) - - organ.take_damage(rand(1,3), 0, 0) - if(!(organ.status & ORGAN_ROBOT)) //There is no blood in protheses. - organ.status |= ORGAN_BLEEDING - src.adjustToxLoss(rand(1,3)) - /mob/living/carbon/human/verb/check_pulse() set category = null set name = "Check pulse" diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 585ac587ffc..747351b9755 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -46,13 +46,14 @@ emp_act var/armor = getarmor_organ(organ, "bullet") if((P.embed && prob(20 + max(P.damage - armor, -10)))) var/obj/item/weapon/shard/shrapnel/SP = new() - (SP.name) = "[P.name] shrapnel" + SP.name = "[P.name] shrapnel" if(P.ammo_casing && P.ammo_casing.caliber) - (SP.desc) = "[SP.desc] It looks like it is a [P.ammo_casing.caliber] caliber round." + SP.desc = "[SP.desc] It looks like it is a [P.ammo_casing.caliber] caliber round." else - (SP.desc) = "[SP.desc] The round's caliber is unidentifiable." - (SP.loc) = organ - organ.embed(SP) + SP.desc = "[SP.desc] The round's caliber is unidentifiable." + throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) + organ.embedded_objects |= SP + SP.forceMove(src) organ.add_autopsy_data(P.name, P.damage) // Add the bullet's name to the autopsy data @@ -297,21 +298,6 @@ emp_act if(Iforce > 10 || Iforce >= 5 && prob(33)) forcesay(hit_appends) //forcesay checks stat already -/* //Melee weapon embedded object code. Commented out, as most people on the forums seem to find this annoying and think it does not contribute to general gameplay. - Dave - if(I.damtype == BRUTE && !I.is_robot_module()) - var/damage = I.force - if(armor) - damage /= armor+1 - - //blunt objects should really not be embedding in things unless a huge amount of force is involved - var/embed_chance = weapon_sharp? damage/I.w_class : damage/(I.w_class*3) - var/embed_threshold = weapon_sharp? 5*I.w_class : 15*I.w_class - - //Sharp objects will always embed if they do enough damage. - if(((weapon_sharp && damage > (10*I.w_class)) || (damage > embed_threshold && prob(embed_chance))) && (I.no_embed == 0) ) - affecting.embed(I) - return 1*/ - //this proc handles being hit by a thrown atom /mob/living/carbon/human/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0) var/obj/item/I @@ -325,24 +311,19 @@ emp_act hitpush = 0 skipcatch = 1 blocked = 1 - /*else if(I) + else if(I) if(I.throw_speed >= EMBED_THROWSPEED_THRESHOLD) - if(!I.is_robot_module()) - var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].", I.armour_penetration) //I guess "melee" is the best fit here - var/sharp = is_sharp(I) - var/damage = throwpower * (I.throw_speed / 5) - if(armor) - damage /= armor + 1 - - //blunt objects should really not be embedding in things unless a huge amount of force is involved - var/embed_chance = sharp? damage / I.w_class : damage/(I.w_class * 3) - var/embed_threshold = sharp? 5 * I.w_class : 15 * I.w_class - - //Sharp objects will always embed if they do enough damage. - //Thrown sharp objects have some momentum already and have a small chance to embed even if the damage is below the threshold - - if(((sharp && prob(damage / (10 * I.w_class) * 100)) || (damage > embed_threshold && prob(embed_chance))) && (I.no_embed == 0)) - affecting.embed(I)*/ + if(can_embed(I)) + if(prob(I.embed_chance)) + throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) + var/obj/item/organ/external/L = pick(bodyparts) + L.embedded_objects |= I +// I.add_mob_blood(src)//it embedded itself in you, of course it's bloody! + I.forceMove(src) + L.take_damage(I.w_class*I.embedded_impact_pain_multiplier) + visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!") + hitpush = 0 + skipcatch = 1 //can't catch the now embedded item return ..() /mob/living/carbon/human/proc/bloody_hands(var/mob/living/source, var/amount = 2) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 00dbc50e8d0..f7504c5cbad 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -40,6 +40,10 @@ if(!client) species.handle_npc(src) + if(stat != DEAD) + //Stuff jammed in your limbs hurts + handle_embedded_objects() + if(stat == DEAD) handle_decay() @@ -839,13 +843,6 @@ blinded = 1 stat = UNCONSCIOUS - if(embedded_flag && !(mob_master.current_cycle % 10)) - var/list/E - E = get_visible_implants(0) - if(!E.len) - embedded_flag = 0 - - //Vision //god knows why this is here var/obj/item/organ/vision if(species.vision_organ) @@ -958,6 +955,22 @@ adjustToxLoss(-3) lastpuke = 0 +/mob/living/carbon/human/proc/handle_embedded_objects() + for(var/X in bodyparts) + var/obj/item/organ/external/BP = X + for(var/obj/item/I in BP.embedded_objects) + if(prob(I.embedded_pain_chance)) + BP.take_damage(I.w_class*I.embedded_pain_multiplier) + to_chat(src, "[I] embedded in your [BP.name] hurts!") + + if(prob(I.embedded_fall_chance)) + BP.take_damage(I.w_class*I.embedded_fall_pain_multiplier) + BP.embedded_objects -= I + I.loc = get_turf(src) + visible_message("[I] falls out of [name]'s [BP.name]!","[I] falls out of your [BP.name]!") + if(!has_embedded_objects()) + clear_alert("embeddedobject") + /mob/living/carbon/human/handle_changeling() if(mind) if(mind.changeling) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index c1d1a169c1d..d658863450d 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -399,9 +399,6 @@ if(has_gravity(H)) gravity = 1 - if(H.embedded_flag) - H.handle_embedded_objects() //Moving with objects stuck in you can cause bad times. - if(!ignoreslow && gravity) if(slowdown) . = slowdown diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 06b6440f756..c1fb31a255b 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -512,6 +512,7 @@ human_mob.restore_blood() human_mob.shock_stage = 0 human_mob.decaylevel = 0 + human_mob.remove_all_embedded_objects() restore_all_organs() surgeries.Cut() //End all surgeries. diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index cb86d417fbc..f4dce4b362b 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1048,104 +1048,6 @@ var/list/slot_equipment_priority = list( \ /mob/proc/get_species() return "" -/mob/proc/get_visible_implants(var/class = 0) - var/list/visible_implants = list() - for(var/obj/item/O in embedded) - if(O.w_class > class) - visible_implants += O - return visible_implants - -/mob/proc/yank_out_object() - set category = "Object" - set name = "Yank out object" - set desc = "Remove an embedded item at the cost of bleeding and pain." - set src in view(1) - - if(!isliving(usr) || usr.next_move > world.time) - return - usr.changeNext_move(CLICK_CD_RESIST) - - if(usr.stat == 1) - to_chat(usr, "You are unconcious and cannot do that!") - return - - if(usr.restrained()) - to_chat(usr, "You are restrained and cannot do that!") - return - - var/mob/S = src - var/mob/U = usr - var/list/valid_objects = list() - var/self = null - - if(S == U) - self = 1 // Removing object from yourself. - - valid_objects = get_visible_implants(0) - if(!valid_objects.len) - if(self) - to_chat(src, "You have nothing stuck in your body that is large enough to remove.") - else - to_chat(U, "[src] has nothing stuck in their wounds that is large enough to remove.") - return - - var/obj/item/weapon/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects - - if(self) - visible_message("[usr] appears to be trying to extract an object from their body.") - to_chat(src, "You attempt to get a good grip on [selection] in your body.") - else - visible_message("[usr] attempts to get a good grip on [selection] in [S]'s body.") - to_chat(U, "You attempt to get a good grip on [selection] in [S]'s body.") - - if(!do_after(U, 80, target = S)) - return - if(!selection || !S || !U) - return - - if(self) - visible_message("[src] rips [selection] out of their body.","You rip [selection] out of your body.") - else - visible_message("[usr] rips [selection] out of [src]'s body.","[usr] rips [selection] out of your body.") - valid_objects = get_visible_implants(0) - if(valid_objects.len == 1) //Yanking out last object - removing verb. - src.verbs -= /mob/proc/yank_out_object - - if(ishuman(src)) - - var/mob/living/carbon/human/H = src - var/obj/item/organ/external/affected - - for(var/obj/item/organ/external/organ in H.bodyparts) //Grab the organ holding the implant. - for(var/obj/item/weapon/O in organ.implants) - if(O == selection) - affected = organ - - affected.implants -= selection - H.shock_stage+=10 - - if(prob(10)) //I'M SO ANEMIC I COULD JUST -DIE-. - var/datum/wound/internal_bleeding/I = new () - affected.wounds += I - H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 1) - - if(ishuman(U)) - var/mob/living/carbon/human/human_user = U - human_user.bloody_hands(H) - - selection.forceMove(get_turf(src)) - if(!(U.l_hand && U.r_hand)) - U.put_in_hands(selection) - - for(var/obj/item/weapon/O in pinned) - if(O == selection) - pinned -= O - if(!pinned.len) - anchored = 0 - return 1 - - - /mob/dead/observer/verb/respawn() set name = "Respawn as NPC" set category = "Ghost" diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 2988363ffb9..a5d0ab00a4d 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -54,7 +54,6 @@ var/unacidable = 0 var/can_strip = 1 var/list/pinned = list() //List of things pinning this creature to walls (see living_defense.dm) - var/list/embedded = list() //Embedded items, since simple mobs don't have organs. var/list/languages = list() // For speaking/listening. var/list/abilities = list() // For species-derived or admin-given powers. var/list/speak_emote = list("says") // Verbs used when speaking. Defaults to 'say' if speak_emote is null. @@ -196,5 +195,5 @@ var/list/permanent_huds = list() var/list/actions = list() - + var/list/progressbars = null //for stacking do_after bars diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 498976c4635..2a4f4ad20ea 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -199,14 +199,14 @@ affected.wounds += I affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1) user.drop_item() - target.internal_organs += tool + affected.hidden = tool tool.forceMove(affected) return 1 else if(IC) user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!", "You pull [IC] out of [target]'s [target_zone].") user.put_in_hands(IC) - target.internal_organs -= IC + affected.hidden = null return 1 else to_chat(user, "You don't find anything in [target]'s [target_zone].") @@ -214,18 +214,18 @@ ////////////////////////////////////////////////////////////////// -// IMPLANT/ITEM REMOVAL SURGERY // +// IMPLANT REMOVAL SURGERY // ////////////////////////////////////////////////////////////////// /datum/surgery/cavity_implant_rem name = "Implant Removal" steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin,/datum/surgery_step/cavity/implant_removal,/datum/surgery_step/cavity/close_space,/datum/surgery_step/generic/cauterize/) - possible_locs = list("chest")//head is for borers..i can put it elsewhere + possible_locs = list("chest") /datum/surgery/cavity_implant_rem/synth name = "Implant Removal" steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/cavity/implant_removal,/datum/surgery_step/robotics/external/close_hatch) - possible_locs = list("chest")//head is for borers..i can put it elsewhere + possible_locs = list("chest") /datum/surgery/cavity_implant_rem/can_start(mob/user, mob/living/carbon/human/target) if(!istype(target)) @@ -295,102 +295,4 @@ else user.visible_message(" [user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out.", \ "You could not find anything inside [target]'s [affected.name].") - return 1 - -/datum/surgery_step/cavity/implant_removal/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - ..() - var/obj/item/organ/external/chest/affected = target.get_organ(target_zone) - if(affected.implants.len) - var/fail_prob = 10 - fail_prob += 100 - tool_quality(tool) - if(prob(fail_prob)) - var/obj/item/weapon/implant/imp = affected.implants[1] - user.visible_message(" Something beeps inside [target]'s [affected.name]!") - playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3) - spawn(25) - imp.activate() - return 0 - - -////////////////////////////////////////////////////////////////// -// EMBEDDED ITEM REOMOVAL // -////////////////////////////////////////////////////////////////// - -/datum/surgery/embedded_removal - name = "Removal of Embedded Objects" - steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/remove_object, /datum/surgery_step/generic/cauterize) - possible_locs = list("r_arm","l_arm","r_leg","l_leg","r_hand","r_foot","l_hand","l_foot","groin","chest","head") - -/datum/surgery/embedded_removal/synth - steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch, /datum/surgery_step/remove_object, /datum/surgery_step/robotics/external/close_hatch) - possible_locs = list("r_arm","l_arm","r_leg","l_leg","r_hand","r_foot","l_hand","l_foot","groin","chest","head") - - -/datum/surgery/embedded_removal/can_start(mob/user, mob/living/carbon/human/target) - if(!istype(target)) - return 0 - var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) - if(!affected) - return 0 - if(affected.status & ORGAN_ROBOT) - return 0 - return 1 - -/datum/surgery/embedded_removal/synth/can_start(mob/user, mob/living/carbon/human/target) - if(!istype(target)) - return 0 - var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) - if(!affected) - return 0 - if(!(affected.status & ORGAN_ROBOT)) - return 0 - return 1 - -/datum/surgery_step/remove_object - name = "remove embedded objects" - time = 32 - allowed_tools = list( - /obj/item/weapon/scalpel/laser/manager = 100, \ - /obj/item/weapon/hemostat = 100, \ - /obj/item/stack/cable_coil = 75, \ - /obj/item/device/assembly/mousetrap = 20 - ) - var/obj/item/organ/external/L = null - - -/datum/surgery_step/remove_object/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) - L = target.get_organ(target_zone) - if(L) - user.visible_message("[user] looks for objects embedded in [target]'s [target_zone].", "You look for objects embedded in [target]'s [target_zone]...") - else - user.visible_message("[user] looks for [target]'s [target_zone].", "You look for [target]'s [target_zone]...") - - -/datum/surgery_step/remove_object/end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(L) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - var/objects = 0 - for(var/obj/item/I in L.implants) - if(!istype(I,/obj/item/weapon/implant)) - objects++ - I.forceMove(get_turf(H)) - L.implants -= I - - //Handle possessive brain borers. - if(H.has_brain_worms() && target_zone == "head")//remove worms outside the loop - var/mob/living/simple_animal/borer/worm = H.has_brain_worms() - if(worm.controlling) - target.release_control() - worm.detach() - worm.leave_host() - user.visible_message("a slug like creature wiggles out of [H]'s [target_zone]!") - - if(objects > 0) - user.visible_message("[user] sucessfully removes [objects] objects from [H]'s [L.limb_name]!", "You sucessfully remove [objects] objects from [H]'s [L.limb_name].") - else - to_chat(user, "You find no objects embedded in [H]'s [L.limb_name]!") - else - to_chat(user, "You can't find [target]'s [target_zone], let alone any objects embedded in it!") - - return 1 + return 1 \ No newline at end of file diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 151636a9a50..ec184269051 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -58,7 +58,7 @@ var/encased // Needs to be opened with a saw to access the organs. var/obj/item/hidden = null - var/list/implants = list() + var/list/embedded_objects = list() // how often wounds should be updated, a higher number means less often var/wound_update_accuracy = 1 @@ -104,7 +104,7 @@ QDEL_LIST(wounds) - QDEL_LIST(implants) + QDEL_LIST(embedded_objects) QDEL_NULL(hidden) @@ -358,12 +358,6 @@ This function completely restores a damaged organ to perfect condition. for(var/obj/item/organ/external/EO in contents) EO.rejuvenate() - // remove embedded objects and drop them on the floor - for(var/obj/implanted_object in implants) - if(!istype(implanted_object,/obj/item/weapon/implant)) // We don't want to remove REAL implants. Just shrapnel etc. - implanted_object.loc = owner.loc - implants -= implanted_object - owner.updatehealth() update_icon() if(!owner) @@ -907,20 +901,6 @@ Note that amputating the affected organ does in fact remove the infection from t /obj/item/organ/external/proc/is_malfunctioning() return ((status & ORGAN_ROBOT) && (brute_dam + burn_dam) >= 10 && prob(brute_dam + burn_dam)) -/obj/item/organ/external/proc/embed(var/obj/item/weapon/W, var/silent = 0) - if(!owner || loc != owner) - return - if(!silent) - owner.visible_message("\The [W] sticks in the wound!") - implants += W - owner.embedded_flag = 1 - owner.verbs += /mob/proc/yank_out_object - W.add_blood(owner) - if(ismob(W.loc)) - var/mob/living/H = W.loc - H.drop_item() - W.loc = owner - /obj/item/organ/external/proc/open_enough_for_surgery() return (encased ? (open == 3) : (open == 2)) @@ -931,14 +911,17 @@ Note that amputating the affected organ does in fact remove the infection from t var/is_robotic = status & ORGAN_ROBOT var/mob/living/carbon/human/victim = owner + for(var/obj/item/I in embedded_objects) + embedded_objects -= I + I.forceMove(src) + if(!owner.has_embedded_objects()) + owner.clear_alert("embeddedobject") + . = ..() status |= ORGAN_DESTROYED victim.bad_external_organs -= src - for(var/implant in implants) //todo: check if this can be left alone - qdel(implant) - // Attached organs also fly off. if(!ignore_children) for(var/obj/item/organ/external/O in children) @@ -1018,3 +1001,22 @@ Note that amputating the affected organ does in fact remove the infection from t ..() // Parent call loads in the DNA if(data["dna"]) sync_colour_to_dna() + +//Remove all embedded objects from all limbs on the carbon mob +/mob/living/carbon/human/proc/remove_all_embedded_objects() + var/turf/T = get_turf(src) + + for(var/X in bodyparts) + var/obj/item/organ/external/L = X + for(var/obj/item/I in L.embedded_objects) + L.embedded_objects -= I + I.forceMove(T) + + clear_alert("embeddedobject") + +/mob/living/carbon/human/proc/has_embedded_objects() + . = 0 + for(var/X in bodyparts) + var/obj/item/organ/external/L = X + for(var/obj/item/I in L.embedded_objects) + return 1 \ No newline at end of file diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm new file mode 100644 index 00000000000..468fe9f7654 --- /dev/null +++ b/code/modules/surgery/remove_embedded_object.dm @@ -0,0 +1,42 @@ +/datum/surgery/embedded_removal + name = "removal of embedded objects" + steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/remove_object) + possible_locs = list("head", "chest", "l_arm", "l_hand", "r_arm", "r_hand","r_leg", "r_foot", "l_leg", "l_foot", "groin") + + +/datum/surgery_step/remove_object + name = "remove embedded objects" + time = 32 + accept_hand = 1 + var/obj/item/organ/external/L = null + + +/datum/surgery_step/remove_object/begin_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + L = surgery.organ_ref + if(L) + user.visible_message("[user] looks for objects embedded in [target]'s [parse_zone(user.zone_sel.selecting)].", "You look for objects embedded in [target]'s [parse_zone(user.zone_sel.selecting)]...") + else + user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_sel.selecting)].", "You look for [target]'s [parse_zone(user.zone_sel.selecting)]...") + + +/datum/surgery_step/remove_object/end_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(L) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + var/objects = 0 + for(var/obj/item/I in L.embedded_objects) + objects++ + I.forceMove(get_turf(H)) + L.embedded_objects -= I + if(!H.has_embedded_objects()) + H.clear_alert("embeddedobject") + + if(objects > 0) + user.visible_message("[user] sucessfully removes [objects] objects from [H]'s [L]!", "You successfully remove [objects] objects from [H]'s [L.name].") + else + to_chat(user, "You find no objects embedded in [H]'s [L]!") + + else + to_chat(user, "You can't find [target]'s [parse_zone(user.zone_sel.selecting)], let alone any objects embedded in it!") + + return 1 \ No newline at end of file diff --git a/paradise.dme b/paradise.dme index 869bffe601b..99e7a6f4913 100644 --- a/paradise.dme +++ b/paradise.dme @@ -2135,6 +2135,7 @@ #include "code\modules\surgery\limb_reattach.dm" #include "code\modules\surgery\organs_internal.dm" #include "code\modules\surgery\other.dm" +#include "code\modules\surgery\remove_embedded_object.dm" #include "code\modules\surgery\rig_removal.dm" #include "code\modules\surgery\robotics.dm" #include "code\modules\surgery\slime.dm" From 673f18f3e79d224fa77e651f67d207ff3a23a4fb Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 5 Jun 2017 17:14:04 -0400 Subject: [PATCH 12/41] tweaks --- code/game/gamemodes/cult/cult_items.dm | 1 + code/game/objects/items/weapons/melee/energy.dm | 4 ++++ code/modules/paperwork/pen.dm | 2 ++ 3 files changed, 7 insertions(+) diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 97511414e7a..bf2c692a0c0 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -41,6 +41,7 @@ w_class = WEIGHT_CLASS_SMALL force = 15 throwforce = 25 + embed_chance = 75 var/cooldown = 0 /obj/item/weapon/melee/cultblade/dagger/afterattack(mob/living/target as mob, mob/living/carbon/human/user as mob) diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 1c1dbbd8363..edd07bef05a 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -25,6 +25,7 @@ force = force_on throwforce = throwforce_on hitsound = 'sound/weapons/blade1.ogg' + throw_speed = 4 if(attack_verb_on.len) attack_verb = attack_verb_on if(!item_color) @@ -38,6 +39,7 @@ force = initial(force) throwforce = initial(throwforce) hitsound = initial(hitsound) + throw_speed = initial(throw_speed) if(attack_verb_on.len) attack_verb = list() icon_state = initial(icon_state) @@ -85,6 +87,8 @@ throw_speed = 3 throw_range = 5 hitsound = "swing_hit" + embed_chance = 75 + embedded_impact_pain_multiplier = 10 armour_penetration = 35 origin_tech = "combat=3;magnets=4;syndicate=4" block_chance = 50 diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 9f5d3534215..7780f057b19 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -159,6 +159,7 @@ w_class = initial(w_class) name = initial(name) hitsound = initial(hitsound) + embed_chance = initial(embed_chance) throwforce = initial(throwforce) playsound(user, 'sound/weapons/saberoff.ogg', 5, 1) to_chat(user, "[src] can now be concealed.") @@ -170,6 +171,7 @@ w_class = WEIGHT_CLASS_NORMAL name = "energy dagger" hitsound = 'sound/weapons/blade1.ogg' + embed_chance = 100 //rule of cool throwforce = 35 playsound(user, 'sound/weapons/saberon.ogg', 5, 1) to_chat(user, "[src] is now active.") From 3de897d884e1bc63876507f69842fe65e4eb4e24 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 5 Jun 2017 17:32:29 -0400 Subject: [PATCH 13/41] more tweaks --- code/datums/uplink_item.dm | 8 +++++++ code/game/objects/items/weapons/shards.dm | 21 +++++++++--------- .../items/weapons/storage/uplink_kits.dm | 13 +++++++++++ code/game/objects/items/weapons/weaponry.dm | 15 +++++++++++++ icons/obj/weapons.dmi | Bin 61352 -> 61488 bytes 5 files changed, 46 insertions(+), 11 deletions(-) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 1cf08abebd0..c3173b8de52 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -750,6 +750,14 @@ var/list/uplink_items = list() cost = 17 excludefrom = list(/datum/game_mode/nuclear) +/datum/uplink_item/stealthy_weapons/throwingweapons + name = "Box of Throwing Weapons" + desc = "A box of shurikens and reinforced bolas from ancient Earth martial arts. They are highly effective \ + throwing weapons. The bolas can knock a target down and the shurikens will embed into limbs." + reference = "STK" + item = /obj/item/weapon/storage/box/syndie_kit/throwing_weapons + cost = 3 + /datum/uplink_item/stealthy_weapons/edagger name = "Energy Dagger" desc = "A dagger made of energy that looks and functions as a pen when off." diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index 554347224eb..8129eca79dc 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -97,19 +97,18 @@ icon = 'icons/obj/shards.dmi' icon_state = "shrapnellarge" desc = "A bunch of tiny bits of shattered metal." + embedded_fall_chance = 0 /obj/item/weapon/shard/shrapnel/New() - - src.icon_state = pick("shrapnellarge", "shrapnelmedium", "shrapnelsmall") - switch(src.icon_state) + ..() + icon_state = pick("shrapnellarge", "shrapnelmedium", "shrapnelsmall") + switch(icon_state) if("shrapnelsmall") - src.pixel_x = rand(-12, 12) - src.pixel_y = rand(-12, 12) + pixel_x = rand(-12, 12) + pixel_y = rand(-12, 12) if("shrapnelmedium") - src.pixel_x = rand(-8, 8) - src.pixel_y = rand(-8, 8) + pixel_x = rand(-8, 8) + pixel_y = rand(-8, 8) if("shrapnellarge") - src.pixel_x = rand(-5, 5) - src.pixel_y = rand(-5, 5) - else - return + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index d721cb46271..976003bc1ee 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -157,6 +157,19 @@ new /obj/item/weapon/grenade/empgrenade(src) new /obj/item/weapon/implanter/emp/(src) +/obj/item/weapon/storage/box/syndie_kit/throwing_weapons + name = "boxed throwing kit" + +/obj/item/weapon/storage/box/syndie_kit/throwing_weapons/New() + ..() + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/restraints/legcuffs/bola/tactical(src) + new /obj/item/weapon/restraints/legcuffs/bola/tactical(src) + /obj/item/weapon/storage/box/syndie_kit/sarin name = "Sarin Gas Grenades" diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 95317b7f0a6..586b24bc719 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -130,6 +130,21 @@ obj/item/weapon/wirerod/attackby(obj/item/I, mob/user, params) qdel(I) qdel(src) +/obj/item/weapon/throwing_star + name = "throwing star" + desc = "An ancient weapon still used to this day due to it's ease of lodging itself into victim's body parts" + icon_state = "throwingstar" + item_state = "eshield0" + force = 2 + throwforce = 20 //This is never used on mobs since this has a 100% embed chance. + throw_speed = 4 + embedded_pain_multiplier = 4 + w_class = WEIGHT_CLASS_SMALL + embed_chance = 100 + embedded_fall_chance = 0 //Hahaha! + sharp = 1 + edge = 1 + materials = list(MAT_METAL=500, MAT_GLASS=500) /obj/item/weapon/spear/kidan icon_state = "kidanspear" diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 83276e5ec57c95cdd644bae01fa269efd7077875..41d47685870af52b58f8397123dc17985b6db467 100644 GIT binary patch delta 19284 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 Date: Mon, 5 Jun 2017 19:35:06 -0400 Subject: [PATCH 14/41] mostly working now --- code/__DEFINES/combat.dm | 5 +- code/_onclick/hud/alert.dm | 6 ++ code/modules/mob/living/carbon/carbon.dm | 2 +- .../surgery/{implant.dm => cavity_implant.dm} | 94 +----------------- code/modules/surgery/implant_removal.dm | 78 +++++++++++++++ code/modules/surgery/organs_internal.dm | 12 +++ .../modules/surgery/remove_embedded_object.dm | 29 +++++- icons/mob/screen_alert.dmi | Bin 36406 -> 37433 bytes paradise.dme | 3 +- 9 files changed, 127 insertions(+), 102 deletions(-) rename code/modules/surgery/{implant.dm => cavity_implant.dm} (70%) create mode 100644 code/modules/surgery/implant_removal.dm diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 71c6bac6979..40f27d0d84f 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -80,7 +80,4 @@ #define WEAPON_LIGHT 0 #define WEAPON_MEDIUM 1 - #define WEAPON_HEAVY 2 - -// Embedded objects -#define EMBED_THROWSPEED_THRESHOLD 15 \ No newline at end of file + #define WEAPON_HEAVY 2 \ No newline at end of file diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 68a24f87a3e..9b80dc2c8e0 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -235,6 +235,12 @@ or something covering your eyes." desc = "All that alcohol you've been drinking is impairing your speech, motor skills, and mental cognition. Make sure to act like it." icon_state = "drunk" +/obj/screen/alert/embeddedobject + name = "Embedded Object" + desc = "Something got lodged into your flesh and is causing major bleeding. It might fall out with time, but surgery is the safest way. \ + If you're feeling frisky, click yourself in help intent to pull the object out." + icon_state = "embeddedobject" + /obj/screen/alert/embeddedobject/Click() if(isliving(usr)) var/mob/living/carbon/human/M = usr diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index eb17146192c..3b0cafbe7b1 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -246,7 +246,7 @@ src.show_message(text("\t []My [] is [].",status=="OK"?"":"",org.name,status),1) for(var/obj/item/I in org.embedded_objects) - to_chat(src, "\t There is \a [I] embedded in your [org.name]!") + to_chat(src, "\t There is \a [I] embedded in your [org.name]!") if(staminaloss) if(staminaloss > 30) diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/cavity_implant.dm similarity index 70% rename from code/modules/surgery/implant.dm rename to code/modules/surgery/cavity_implant.dm index 2a4f4ad20ea..bd82e7192ae 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/cavity_implant.dm @@ -1,10 +1,3 @@ -//Procedures in this file: Putting items in body cavity. Implant removal. Items removal. - - -////////////////////////////////////////////////////////////////// -// ITEM PLACEMENT SURGERY // -////////////////////////////////////////////////////////////////// - /datum/surgery/cavity_implant name = "Cavity Implant/Removal" steps = list(/datum/surgery_step/generic/cut_open,/datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/open_encased/saw, @@ -210,89 +203,4 @@ return 1 else to_chat(user, "You don't find anything in [target]'s [target_zone].") - return 0 - - -////////////////////////////////////////////////////////////////// -// IMPLANT REMOVAL SURGERY // -////////////////////////////////////////////////////////////////// - -/datum/surgery/cavity_implant_rem - name = "Implant Removal" - steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin,/datum/surgery_step/cavity/implant_removal,/datum/surgery_step/cavity/close_space,/datum/surgery_step/generic/cauterize/) - possible_locs = list("chest") - -/datum/surgery/cavity_implant_rem/synth - name = "Implant Removal" - steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/cavity/implant_removal,/datum/surgery_step/robotics/external/close_hatch) - possible_locs = list("chest") - -/datum/surgery/cavity_implant_rem/can_start(mob/user, mob/living/carbon/human/target) - if(!istype(target)) - return 0 - var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) - if(!affected) - return 0 - if(affected.status & ORGAN_ROBOT) - return 0 - return 1 - -/datum/surgery/cavity_implant_rem/synth/can_start(mob/user, mob/living/carbon/human/target) - if(!istype(target)) - return 0 - var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) - if(!affected) - return 0 - if(!(affected.status & ORGAN_ROBOT)) - return 0 - - return 1 - -/datum/surgery_step/cavity/implant_removal - name = "extract implant" - allowed_tools = list( - /obj/item/weapon/hemostat = 100, \ - /obj/item/weapon/wirecutters = 75, \ - /obj/item/weapon/kitchen/utensil/fork = 20 - ) - var/obj/item/weapon/implant/I = null - time = 64 - -/datum/surgery_step/cavity/implant_removal/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - I = locate(/obj/item/weapon/implant) in target - user.visible_message("[user] starts poking around inside [target]'s [affected.name] with \the [tool].", \ - "You start poking around inside [target]'s [affected.name] with \the [tool]." ) - target.custom_pain("The pain in your [affected.name] is living hell!",1) - ..() - -/datum/surgery_step/cavity/implant_removal/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - I = locate(/obj/item/weapon/implant) in target - if(I && (target_zone == "chest")) //implant removal only works on the chest. - user.visible_message("[user] takes something out of [target]'s [affected.name] with \the [tool].", \ - "You take [I] out of [target]'s [affected.name]s with \the [tool]." ) - - I.removed(target) - - var/obj/item/weapon/implantcase/case - - if(istype(user.get_item_by_slot(slot_l_hand), /obj/item/weapon/implantcase)) - case = user.get_item_by_slot(slot_l_hand) - else if(istype(user.get_item_by_slot(slot_r_hand), /obj/item/weapon/implantcase)) - case = user.get_item_by_slot(slot_r_hand) - else - case = locate(/obj/item/weapon/implantcase) in get_turf(target) - - if(case && !case.imp) - case.imp = I - I.loc = case - case.update_icon() - user.visible_message("[user] places [I] into [case]!", "You place [I] into [case].") - else - qdel(I) - return 1 - else - user.visible_message(" [user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out.", \ - "You could not find anything inside [target]'s [affected.name].") - return 1 \ No newline at end of file + return 0 \ No newline at end of file diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm new file mode 100644 index 00000000000..21994202765 --- /dev/null +++ b/code/modules/surgery/implant_removal.dm @@ -0,0 +1,78 @@ +////////////////////////////////////////////////////////////////// +// IMPLANT REMOVAL SURGERY // +////////////////////////////////////////////////////////////////// + +/datum/surgery/implant_removal + name = "Implant Removal" + steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin,/datum/surgery_step/extract_implant,/datum/surgery_step/generic/cauterize) + possible_locs = list("chest") + +/datum/surgery/implant_removal/synth + name = "Implant Removal" + steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/extract_implant,/datum/surgery_step/robotics/external/close_hatch) + possible_locs = list("chest") + +/datum/surgery/implant_removal/can_start(mob/user, mob/living/carbon/human/target) + if(!istype(target)) + return 0 + var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) + if(!affected) + return 0 + if(affected.status & ORGAN_ROBOT) + return 0 + return 1 + +/datum/surgery/implant_removal/synth/can_start(mob/user, mob/living/carbon/human/target) + if(!istype(target)) + return 0 + var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) + if(!affected) + return 0 + if(!(affected.status & ORGAN_ROBOT)) + return 0 + + return 1 + +/datum/surgery_step/extract_implant + name = "extract implant" + allowed_tools = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/crowbar = 65) + time = 64 + var/obj/item/weapon/implant/I = null + +/datum/surgery_step/extract_implant/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + I = locate(/obj/item/weapon/implant) in target + user.visible_message("[user] starts poking around inside [target]'s [affected.name] with \the [tool].", \ + "You start poking around inside [target]'s [affected.name] with \the [tool]." ) + target.custom_pain("The pain in your [affected.name] is living hell!",1) + ..() + +/datum/surgery_step/extract_implant/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + I = locate(/obj/item/weapon/implant) in target + if(I && (target_zone == "chest")) //implant removal only works on the chest. + user.visible_message("[user] takes something out of [target]'s [affected.name] with \the [tool].", \ + "You take [I] out of [target]'s [affected.name]s with \the [tool]." ) + + I.removed(target) + + var/obj/item/weapon/implantcase/case + + if(istype(user.get_item_by_slot(slot_l_hand), /obj/item/weapon/implantcase)) + case = user.get_item_by_slot(slot_l_hand) + else if(istype(user.get_item_by_slot(slot_r_hand), /obj/item/weapon/implantcase)) + case = user.get_item_by_slot(slot_r_hand) + else + case = locate(/obj/item/weapon/implantcase) in get_turf(target) + + if(case && !case.imp) + case.imp = I + I.loc = case + case.update_icon() + user.visible_message("[user] places [I] into [case]!", "You place [I] into [case].") + else + qdel(I) + else + user.visible_message(" [user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out.", \ + "You could not find anything inside [target]'s [affected.name].") + return 1 \ No newline at end of file diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 420d56de43d..6b71afdcadf 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -159,6 +159,11 @@ else if(implement_type in implements_extract) current_type = "extract" var/list/organs = target.get_organs_zone(target_zone) + var/mob/living/simple_animal/borer/B = target.has_brain_worms() + if(B) + user.visible_message("[user] begins to extract [B] from [target]'s [parse_zone(target_zone)].", + "You begin to extract [B] from [target]'s [parse_zone(target_zone)]...") + return TRUE if(!organs.len) to_chat(user, "There are no removeable organs in [target]'s [parse_zone(target_zone)]!") return -1 @@ -262,6 +267,13 @@ I.status &= ~ORGAN_CUT_AWAY else if(current_type == "extract") +/* var/mob/living/simple_animal/borer/B = target.has_brain_worms() + if(B && B.victim == target) + user.visible_message("[user] successfully extracts [B] from [target]'s [parse_zone(target_zone)]!", + "You successfully extract [B] from [target]'s [parse_zone(target_zone)].") + add_logs(user, target, "surgically removed [B] from", addition="INTENT: [uppertext(user.a_intent)]") + B.leave_victim() + return FALSE */ if(I && I.owner == target) user.visible_message(" [user] has separated and extracts [target]'s [I] with [tool].", " You have separated and extracted [target]'s [I] with [tool].") diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm index 468fe9f7654..d7fe8b7fb53 100644 --- a/code/modules/surgery/remove_embedded_object.dm +++ b/code/modules/surgery/remove_embedded_object.dm @@ -1,11 +1,34 @@ /datum/surgery/embedded_removal - name = "removal of embedded objects" - steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/remove_object) + name = "Removal of Embedded Objects" + steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/remove_object,/datum/surgery_step/generic/cauterize) possible_locs = list("head", "chest", "l_arm", "l_hand", "r_arm", "r_hand","r_leg", "r_foot", "l_leg", "l_foot", "groin") +/datum/surgery/embedded_removal/synth + steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/remove_object,/datum/surgery_step/robotics/external/close_hatch) + +/datum/surgery/embedded_removal/can_start(mob/user, mob/living/carbon/human/target) + if(!istype(target)) + return 0 + var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) + if(!affected) + return 0 + if(affected.status & ORGAN_ROBOT) + return 0 + return 1 + +/datum/surgery/embedded_removal/synth/can_start(mob/user, mob/living/carbon/human/target) + if(!istype(target)) + return 0 + var/obj/item/organ/external/affected = target.get_organ(user.zone_sel.selecting) + if(!affected) + return 0 + if(!(affected.status & ORGAN_ROBOT)) + return 0 + + return 1 /datum/surgery_step/remove_object - name = "remove embedded objects" + name = "Remove Embedded Objects" time = 32 accept_hand = 1 var/obj/item/organ/external/L = null diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index 99359f5b079162980a798297bdeb6e237591ac97..297f9a9aae2898b2f93f978d73f1827fe18a7724 100644 GIT binary patch delta 17153 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 HEkpkw`d;u9 diff --git a/paradise.dme b/paradise.dme index 99e7a6f4913..74bcfa956a3 100644 --- a/paradise.dme +++ b/paradise.dme @@ -2126,12 +2126,13 @@ #include "code\modules\store\items.dm" #include "code\modules\store\store.dm" #include "code\modules\surgery\bones.dm" +#include "code\modules\surgery\cavity_implant.dm" #include "code\modules\surgery\dental_implant.dm" #include "code\modules\surgery\encased.dm" #include "code\modules\surgery\face.dm" #include "code\modules\surgery\generic.dm" #include "code\modules\surgery\helpers.dm" -#include "code\modules\surgery\implant.dm" +#include "code\modules\surgery\implant_removal.dm" #include "code\modules\surgery\limb_reattach.dm" #include "code\modules\surgery\organs_internal.dm" #include "code\modules\surgery\other.dm" From 4f5c187d274b4921844569dd27ed5904b8134ed2 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 5 Jun 2017 20:06:48 -0400 Subject: [PATCH 15/41] finally --- code/game/dna/genes/goon_powers.dm | 3 --- code/modules/clothing/spacesuits/rig/rig.dm | 4 ---- code/modules/mob/living/carbon/brain/brain_item.dm | 4 ++-- code/modules/mob/mob_defines.dm | 1 - code/modules/surgery/organs_internal.dm | 10 +++++----- 5 files changed, 7 insertions(+), 15 deletions(-) diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index 16f8dad4bdb..06e98ecf9f4 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -414,9 +414,6 @@ else M.stop_pulling() - if(user.pinned.len) - failure = 1 - user.visible_message("[user.name] takes a huge leap!") playsound(user.loc, 'sound/weapons/thudswoosh.ogg', 50, 1) if(failure) diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index da181368cc5..f1fb29ed645 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -978,10 +978,6 @@ else M.stop_pulling() - if(wearer.pinned.len) - to_chat(src, "Your host is pinned to a wall by [wearer.pinned[1]]!") - return 0 - // AIs are a bit slower than regular and ignore move intent. wearer_move_delay = world.time + ai_controlled_move_delay diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 7a12b570201..daeebf8442f 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -71,9 +71,9 @@ var/obj/item/organ/internal/brain/B = src if(!special) var/mob/living/simple_animal/borer/borer = owner.has_brain_worms() - if(borer) - borer.detach() //Should remove borer if the brain is removed - RR + borer.leave_host() //Should remove borer if the brain is removed - RR + if(owner.mind && !non_primary)//don't transfer if the owner does not have a mind. B.transfer_identity(user) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index a5d0ab00a4d..2b35b3ce1a7 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -53,7 +53,6 @@ var/lastpuke = 0 var/unacidable = 0 var/can_strip = 1 - var/list/pinned = list() //List of things pinning this creature to walls (see living_defense.dm) var/list/languages = list() // For speaking/listening. var/list/abilities = list() // For species-derived or admin-given powers. var/list/speak_emote = list("says") // Verbs used when speaking. Defaults to 'say' if speak_emote is null. diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 6b71afdcadf..32badd09ec0 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -160,7 +160,7 @@ current_type = "extract" var/list/organs = target.get_organs_zone(target_zone) var/mob/living/simple_animal/borer/B = target.has_brain_worms() - if(B) + if(target_zone == "head" && B) user.visible_message("[user] begins to extract [B] from [target]'s [parse_zone(target_zone)].", "You begin to extract [B] from [target]'s [parse_zone(target_zone)]...") return TRUE @@ -267,13 +267,13 @@ I.status &= ~ORGAN_CUT_AWAY else if(current_type == "extract") -/* var/mob/living/simple_animal/borer/B = target.has_brain_worms() - if(B && B.victim == target) + var/mob/living/simple_animal/borer/B = target.has_brain_worms() + if(target_zone == "head" && B && B.host == target) user.visible_message("[user] successfully extracts [B] from [target]'s [parse_zone(target_zone)]!", "You successfully extract [B] from [target]'s [parse_zone(target_zone)].") add_logs(user, target, "surgically removed [B] from", addition="INTENT: [uppertext(user.a_intent)]") - B.leave_victim() - return FALSE */ + B.leave_host() + return FALSE if(I && I.owner == target) user.visible_message(" [user] has separated and extracts [target]'s [I] with [tool].", " You have separated and extracted [target]'s [I] with [tool].") From 3e344e4526d83dbd301d3fb085c4bde6b220c555 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 5 Jun 2017 20:34:50 -0400 Subject: [PATCH 16/41] fixes --- code/modules/mob/living/carbon/human/human.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 2 +- code/modules/surgery/implant_removal.dm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 3a233c869db..2ed1fc83c03 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -712,7 +712,7 @@ if(!I || !L || I.loc != src || !(I in L.embedded_objects)) return L.embedded_objects -= I - L.receive_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus. + L.take_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus. I.forceMove(get_turf(src)) usr.put_in_hands(I) usr.emote("scream") diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index f7504c5cbad..6599b0823d0 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -966,7 +966,7 @@ if(prob(I.embedded_fall_chance)) BP.take_damage(I.w_class*I.embedded_fall_pain_multiplier) BP.embedded_objects -= I - I.loc = get_turf(src) + I.forceMove(get_turf(src)) visible_message("[I] falls out of [name]'s [BP.name]!","[I] falls out of your [BP.name]!") if(!has_embedded_objects()) clear_alert("embeddedobject") diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm index 21994202765..7b04be81e1d 100644 --- a/code/modules/surgery/implant_removal.dm +++ b/code/modules/surgery/implant_removal.dm @@ -67,7 +67,7 @@ if(case && !case.imp) case.imp = I - I.loc = case + I.forceMove(case) case.update_icon() user.visible_message("[user] places [I] into [case]!", "You place [I] into [case].") else From f4409825c3e158fbd93a4e95a6385e3206a79aec Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 6 Jun 2017 00:10:59 -0400 Subject: [PATCH 17/41] last fixes --- code/game/objects/items/weapons/storage/uplink_kits.dm | 3 +++ code/modules/mob/living/carbon/human/examine.dm | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 976003bc1ee..47349744c99 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -159,6 +159,9 @@ /obj/item/weapon/storage/box/syndie_kit/throwing_weapons name = "boxed throwing kit" + can_hold = list(/obj/item/weapon/throwing_star, /obj/item/weapon/restraints/legcuffs/bola/tactical) + max_combined_w_class = 16 + max_w_class = WEIGHT_CLASS_NORMAL /obj/item/weapon/storage/box/syndie_kit/throwing_weapons/New() ..() diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 2215df8d3f4..961ee9ffd0b 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -383,7 +383,7 @@ wound_flavor_text["[temp.limb_name]"] = "" for(var/obj/item/I in temp.embedded_objects) - msg += "[t_He] [t_has] \a \icon[I] [I] embedded in [t_his] [temp.name]!\n" + msg += "[t_He] [t_has] \a [bicon(I)] [I] embedded in [t_his] [temp.name]!\n" //Handles the text strings being added to the actual description. //If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext. From 15564fef422ba5d9870d24dd88b626c496f53a51 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Sun, 18 Jun 2017 21:42:29 -0400 Subject: [PATCH 18/41] Sentience_organic check. --- code/modules/events/sentience.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index 4a1b44700e3..c3cc37f1c04 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -4,11 +4,13 @@ var/ghostmsg = "Do you want to awaken as a sentient being?" var/list/candidates = pollCandidates(ghostmsg, ROLE_SENTIENT, 1) var/list/potential = list() + var/sentience_type = SENTIENCE_ORGANIC + for(var/mob/living/simple_animal/L in living_mob_list) var/turf/T = get_turf(L) if (T.z != 1) continue - if(!(L in player_list) && !L.mind) + if(!(L in player_list) && !L.mind && (L.sentience_type == sentience_type)) potential += L var/mob/living/simple_animal/SA = pick(potential) From ff148fb2a68d0817a71e3185891a88bf17d5bcb5 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Wed, 21 Jun 2017 03:08:58 -0400 Subject: [PATCH 19/41] fluff objectives --- code/modules/events/sentience.dm | 34 ++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index c3cc37f1c04..d7aab5b0aa5 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -26,9 +26,43 @@ SA.health = SA.maxHealth SA.del_on_death = FALSE greet_sentient(SA) + var/objtype = pick(subtypesof(/datum/objective/sentFluff/)) + var/datum/objective/sentFluff/O = new objtype() + SA.mind.objectives += O + to_chat(SA, "Purpose in life: [O.explanation_text]") /datum/event/sentience/proc/greet_sentient(var/mob/living/carbon/human/M) to_chat(M, "Hello world!") to_chat(M, "Due to freak radiation, you have gained \ human level intelligence and the ability to speak and understand \ human language!") +/datum/objective/sentFluff + completed = 1 + +/datum/objective/sentFluff/steal + explanation_text = "You have the urge to steal as many " + +/datum/objective/sentFluff/steal/New() + var/things = pick(list("lights","fruits","shoes","bars of soap", "hats", "pants", "organs")) + explanation_text += " [things] as you can!" + +/datum/objective/sentFluff/fear + explanation_text = "In your new found sentience you have learnd" + +/datum/objective/sentFluff/fear/New() + var/list/jobs = job_master.occupations.Copy() + for(var/datum/job/J in jobs) + if(J.current_positions < 1) + jobs -= J + if(jobs.len > 0) + var/datum/job/target = pick(jobs) + explanation_text += " that [target.title] are evil, avoid these scary things!" + else + explanation_text += " people are evil, avoid these scary things!" + +/datum/objective/sentFluff/toy + explanation_text = "You MUST find your special " + +/datum/objective/sentFluff/toy/New() + var/toy = pick(list("shoe","rubber duck","bike horn","bar of soap", "hat", "par of pants")) + explanation_text += " [toy] and not lose it! EVER!" From f65778cdacadddbaff4f1ac5781141b236e7cdee Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Wed, 21 Jun 2017 23:33:31 -0400 Subject: [PATCH 20/41] spelling tweaks --- code/modules/events/sentience.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index d7aab5b0aa5..988ae7a2386 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -47,7 +47,7 @@ explanation_text += " [things] as you can!" /datum/objective/sentFluff/fear - explanation_text = "In your new found sentience you have learnd" + explanation_text = "In your new found sentience you have learned" /datum/objective/sentFluff/fear/New() var/list/jobs = job_master.occupations.Copy() @@ -64,5 +64,5 @@ explanation_text = "You MUST find your special " /datum/objective/sentFluff/toy/New() - var/toy = pick(list("shoe","rubber duck","bike horn","bar of soap", "hat", "par of pants")) + var/toy = pick(list("shoe","rubber duck","bike horn","bar of soap", "hat", "pair of pants")) explanation_text += " [toy] and not lose it! EVER!" From 86dd1db600ab183229ae18d5306d33415e95a056 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Wed, 28 Jun 2017 00:37:49 -0400 Subject: [PATCH 21/41] fine --- code/modules/events/sentience.dm | 45 +++++++++----------------------- 1 file changed, 12 insertions(+), 33 deletions(-) diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index 988ae7a2386..cfa0d24d98e 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -19,6 +19,17 @@ if(!SA || !SG) //if you can't find either a simple animal or a player, end return FALSE + var/sentience_report = "[command_name()] Medium-Priority Update" + + var/data = pick("scans from our long-range sensors", "our sophisticated probabilistic models", "our omnipotence", "the communications traffic on your station", "energy emissions we detected", "\[REDACTED\]", "Steve") + var/pets = pick("animals", "pets", "simple animals", "lesser lifeforms", "\[REDACTED\]") + var/strength = pick("human", "skrell", "vox", "grey", "diona", "IPC", "tajaran", "vulpakanin", "kidan", "plasmaman", "drask", + "slime", "monkey", "moderate", "lizard", "security", "command", "clown", "mime", "low", "very low", "greytide", "catgirl", "\[REDACTED\]") + + sentience_report += "

    Based on [data], we believe that one of the station's [pets] has developed [strength] level intelligence, and the ability to communicate." + + + SA.key = SG.key SA.universal_speak = 1 SA.sentience_act() @@ -26,43 +37,11 @@ SA.health = SA.maxHealth SA.del_on_death = FALSE greet_sentient(SA) - var/objtype = pick(subtypesof(/datum/objective/sentFluff/)) - var/datum/objective/sentFluff/O = new objtype() - SA.mind.objectives += O - to_chat(SA, "Purpose in life: [O.explanation_text]") + print_command_report(sentience_report, "[command_name()] Update") /datum/event/sentience/proc/greet_sentient(var/mob/living/carbon/human/M) to_chat(M, "Hello world!") to_chat(M, "Due to freak radiation, you have gained \ human level intelligence and the ability to speak and understand \ human language!") -/datum/objective/sentFluff - completed = 1 -/datum/objective/sentFluff/steal - explanation_text = "You have the urge to steal as many " - -/datum/objective/sentFluff/steal/New() - var/things = pick(list("lights","fruits","shoes","bars of soap", "hats", "pants", "organs")) - explanation_text += " [things] as you can!" - -/datum/objective/sentFluff/fear - explanation_text = "In your new found sentience you have learned" - -/datum/objective/sentFluff/fear/New() - var/list/jobs = job_master.occupations.Copy() - for(var/datum/job/J in jobs) - if(J.current_positions < 1) - jobs -= J - if(jobs.len > 0) - var/datum/job/target = pick(jobs) - explanation_text += " that [target.title] are evil, avoid these scary things!" - else - explanation_text += " people are evil, avoid these scary things!" - -/datum/objective/sentFluff/toy - explanation_text = "You MUST find your special " - -/datum/objective/sentFluff/toy/New() - var/toy = pick(list("shoe","rubber duck","bike horn","bar of soap", "hat", "pair of pants")) - explanation_text += " [toy] and not lose it! EVER!" From 466f12db20ca1b4acc259809eaec0b1c41483638 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 28 Jun 2017 12:27:23 +0100 Subject: [PATCH 22/41] Fixes sprite & desc issues --- code/modules/clothing/suits/miscellaneous.dm | 6 +++--- code/modules/clothing/under/miscellaneous.dm | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 43b89d315d9..a5340ed91bc 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -952,17 +952,17 @@ /obj/item/clothing/suit/tailcoat name = "victorian tailcoat" - desc = "a fancy victorian tailcoat." + desc = "A fancy victorian tailcoat." icon_state = "tailcoat" item_state = "tailcoat" /obj/item/clothing/suit/victcoat name = "ladies victorian coat" - desc = "a fancy victorian coat." + desc = "A fancy victorian coat." icon_state = "ladiesvictoriancoat" item_state = "ladiesvictoriancoat" /obj/item/clothing/suit/victcoat/red name = "ladies red victorian coat" icon_state = "ladiesredvictoriancoat" - item_state = "ladiesredvictoriancoat" \ No newline at end of file + item_state = "ladiesredvictoriancoat" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 4fa40404c46..8066deb3074 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -791,10 +791,10 @@ /obj/item/clothing/under/victdress name = "black victorian dress" - desc = "a victorian style dress, fancy!." + desc = "A victorian style dress, fancy!" icon_state = "victorianblackdress" - item_state = "Victorianblackdress" - item_color = "Victorianblackdress" + item_state = "victorianblackdress" + item_color = "victorianblackdress" body_parts_covered = UPPER_TORSO|LOWER_TORSO /obj/item/clothing/under/victdress/red @@ -805,7 +805,7 @@ /obj/item/clothing/under/victsuit name = "victorian suit" - desc = "a victorian style suit, fancy!." + desc = "A victorian style suit, fancy!" icon_state = "victorianvest" item_state = "victorianvest" item_color = "victorianvest" From 4ae1df57c32f6d5246d66f09b7e1b17ee5c48277 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 28 Jun 2017 17:38:00 -0400 Subject: [PATCH 23/41] Automatic changelog generation for PR #7580 [ci skip] --- html/changelogs/AutoChangeLog-pr-7580.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7580.yml diff --git a/html/changelogs/AutoChangeLog-pr-7580.yml b/html/changelogs/AutoChangeLog-pr-7580.yml new file mode 100644 index 00000000000..85af05fcffe --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7580.yml @@ -0,0 +1,4 @@ +author: "Purpose2 and Re-Opened by Fethas" +delete-after: True +changes: + - rscadd: "Rare Sentience event, the mice now want coffee!" From db6717ae0c5d8996fdd34d7f893c87daaeaa99c0 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 28 Jun 2017 18:25:44 -0400 Subject: [PATCH 24/41] Automatic changelog compile, [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-7580.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-7580.yml diff --git a/html/changelog.html b/html/changelog.html index 70f2ffdb953..8aa28cf13d4 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,12 @@ -->
    +

    28 June 2017

    +

    Purpose2 and Re-Opened by Fethas updated:

    +
      +
    • Rare Sentience event, the mice now want coffee!
    • +
    +

    27 June 2017

    Alexshreds updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 24dd1649beb..7b8a401d065 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -5054,3 +5054,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. these. tigercat2000: - tweak: Karma returned to the Special Verbs tab +2017-06-28: + Purpose2 and Re-Opened by Fethas: + - rscadd: Rare Sentience event, the mice now want coffee! diff --git a/html/changelogs/AutoChangeLog-pr-7580.yml b/html/changelogs/AutoChangeLog-pr-7580.yml deleted file mode 100644 index 85af05fcffe..00000000000 --- a/html/changelogs/AutoChangeLog-pr-7580.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Purpose2 and Re-Opened by Fethas" -delete-after: True -changes: - - rscadd: "Rare Sentience event, the mice now want coffee!" From d090d2134ae11e696f71d105d9ccc807e7c36f7d Mon Sep 17 00:00:00 2001 From: Alffd Date: Wed, 28 Jun 2017 19:48:28 -0400 Subject: [PATCH 25/41] Topic Kick --- code/world.dm | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/code/world.dm b/code/world.dm index 34d61dbbc21..e293058cdf6 100644 --- a/code/world.dm +++ b/code/world.dm @@ -244,6 +244,27 @@ var/world_topic_spam_protect_time = world.timeofday for(var/client/C in clients) to_chat(C, "PR: [input["announce"]]") + else if("kick" in input) + /* + We have a kick request over coms. + Only needed portion is the ckey + */ + if(!key_valid) + return keySpamProtect(addr) + + var/client/C + + for(var/client/K in clients) + if(K.ckey == input["kick"]) + C = K + break + if(!C) + return "No client with that name on server" + + del(C) + + return "Kick Successful" + /proc/keySpamProtect(var/addr) if(world_topic_spam_protect_ip == addr && abs(world_topic_spam_protect_time - world.time) < 50) spawn(50) From 12ffb7e1606104ececb5587edc2ab5a44732d2e5 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Wed, 28 Jun 2017 22:35:15 -0400 Subject: [PATCH 26/41] Fixes IPC Heads --- code/modules/client/preference/preferences.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 9e40914da9b..5f3cc4dec2b 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -2154,7 +2154,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts else if(status == "cyborg") if(rlimb_data[name]) - O.robotize(rlimb_data[name]) + O.robotize(rlimb_data[name], convert_all = 0) else O.robotize() else From 139ad3748d73f73f651ed21c38dee09111789449 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 28 Jun 2017 23:20:58 -0400 Subject: [PATCH 27/41] Automatic changelog generation for PR #7659 [ci skip] --- html/changelogs/AutoChangeLog-pr-7659.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7659.yml diff --git a/html/changelogs/AutoChangeLog-pr-7659.yml b/html/changelogs/AutoChangeLog-pr-7659.yml new file mode 100644 index 00000000000..a8b88024f88 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7659.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Fix's IPC head customization" From 7a18716d9d655375a841aeedd032396cc171369a Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 28 Jun 2017 23:30:49 -0400 Subject: [PATCH 28/41] Automatic changelog compile, [ci skip] --- html/changelog.html | 4 ++++ html/changelogs/.all_changelog.yml | 2 ++ html/changelogs/AutoChangeLog-pr-7659.yml | 4 ---- 3 files changed, 6 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-7659.yml diff --git a/html/changelog.html b/html/changelog.html index 8aa28cf13d4..73d5ee92bfc 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,10 @@ -->

      28 June 2017

      +

      Fox McCloud updated:

      +
        +
      • Fix's IPC head customization
      • +

      Purpose2 and Re-Opened by Fethas updated:

      • Rare Sentience event, the mice now want coffee!
      • diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 7b8a401d065..86acc489838 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -5055,5 +5055,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. tigercat2000: - tweak: Karma returned to the Special Verbs tab 2017-06-28: + Fox McCloud: + - bugfix: Fix's IPC head customization Purpose2 and Re-Opened by Fethas: - rscadd: Rare Sentience event, the mice now want coffee! diff --git a/html/changelogs/AutoChangeLog-pr-7659.yml b/html/changelogs/AutoChangeLog-pr-7659.yml deleted file mode 100644 index a8b88024f88..00000000000 --- a/html/changelogs/AutoChangeLog-pr-7659.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fix's IPC head customization" From 5ae7510038f6996780b4139ce25490f950ec1858 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 29 Jun 2017 00:27:45 -0400 Subject: [PATCH 29/41] Fixes Limb Augmentation Open Wound --- code/modules/surgery/limb_augmentation.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm index 174076c5fab..773508c88ea 100644 --- a/code/modules/surgery/limb_augmentation.dm +++ b/code/modules/surgery/limb_augmentation.dm @@ -52,4 +52,7 @@ qdel(tool) + affected.open = 0 + affected.germ_level = 0 + affected.status &= ~ORGAN_BLEEDING return 1 \ No newline at end of file From 4a563ec40d09d1c8cd5ff3b9aec34a586f1a131c Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 29 Jun 2017 00:39:51 -0400 Subject: [PATCH 30/41] Automatic changelog generation for PR #7663 [ci skip] --- html/changelogs/AutoChangeLog-pr-7663.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7663.yml diff --git a/html/changelogs/AutoChangeLog-pr-7663.yml b/html/changelogs/AutoChangeLog-pr-7663.yml new file mode 100644 index 00000000000..09efcb86848 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7663.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes limbs being an open wound after augmentation" From 933d7e97805caf95461867fd7327887f8586d055 Mon Sep 17 00:00:00 2001 From: fludd12 Date: Thu, 29 Jun 2017 00:45:04 -0400 Subject: [PATCH 31/41] Fixes the last things --- code/modules/mob/living/carbon/human/species/species.dm | 2 +- code/modules/mob/living/carbon/human/species/station.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index ccaff68fec7..76000a4c431 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -679,4 +679,4 @@ It'll return null if the organ doesn't correspond, so include null checks when u H.see_invisible = H.see_override /datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source) - ..() \ No newline at end of file + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 9355f5b38ec..54555a6152a 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -751,9 +751,9 @@ ..() /datum/species/grey/water_act(var/mob/living/carbon/C, volume, temperature, source) + ..() C.take_organ_damage(5,min(volume,20)) C.emote("scream") - ..() /datum/species/grey/after_equip_job(datum/job/J, mob/living/carbon/human/H) var/speech_pref = H.client.prefs.speciesprefs From aa22d080efdeb0888f0d758a5e737a80188848bb Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 29 Jun 2017 01:15:51 -0400 Subject: [PATCH 32/41] Automatic changelog compile, [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-7663.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-7663.yml diff --git a/html/changelog.html b/html/changelog.html index 73d5ee92bfc..afa450bfa5f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,12 @@ -->
        +

        29 June 2017

        +

        Fox McCloud updated:

        +
          +
        • Fixes limbs being an open wound after augmentation
        • +
        +

        28 June 2017

        Fox McCloud updated:

          diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 86acc489838..ed6871bcdcb 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -5059,3 +5059,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: Fix's IPC head customization Purpose2 and Re-Opened by Fethas: - rscadd: Rare Sentience event, the mice now want coffee! +2017-06-29: + Fox McCloud: + - bugfix: Fixes limbs being an open wound after augmentation diff --git a/html/changelogs/AutoChangeLog-pr-7663.yml b/html/changelogs/AutoChangeLog-pr-7663.yml deleted file mode 100644 index 09efcb86848..00000000000 --- a/html/changelogs/AutoChangeLog-pr-7663.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes limbs being an open wound after augmentation" From 04b02435fbcd3b40d11632157078d402a9e72403 Mon Sep 17 00:00:00 2001 From: Kluys Date: Thu, 29 Jun 2017 21:28:04 +0200 Subject: [PATCH 33/41] Bob ross painting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit While trying to fix my github accidentally closed https://github.com/ParadiseSS13/Paradise/pull/7629 from the shell. Redid the entire PR. Changes remained the same ![Image of captains office](https://puu.sh/wuWt0/4ea9796196.png) 🆑 Kluys Add: Bob ross painting in the captains office called "calming painting". Also changes around the entertainment monitor and light switch to accomodate. Fix: Clown painting was named "\improper mech painting" / 🆑 --- _maps/map_files/cyberiad/cyberiad.dmm | 4 ++-- code/game/objects/structures/signs.dm | 7 ++++++- icons/obj/decals.dmi | Bin 37850 -> 39652 bytes 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 48ccd7f83e6..38453d4f526 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -2690,6 +2690,7 @@ "aZL" = (/obj/item/weapon/restraints/handcuffs/pinkcuffs,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "aZM" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "aZN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) +"aZO" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/twohanded/required/kirbyplants,/obj/structure/sign/bobross{pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/captain) "aZV" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aZW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) "aZX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -3979,7 +3980,6 @@ "byW" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "byX" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "north bump Important Area"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/crew_quarters/captain) "byY" = (/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain) -"byZ" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bza" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/ne) "bzb" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne) "bzc" = (/obj/structure/sign/directions/evac{dir = 4},/obj/structure/sign/directions/medical{dir = 4; pixel_y = 7},/obj/structure/sign/directions/science{dir = 4},/turf/simulated/wall,/area/crew_quarters/bar) @@ -9107,7 +9107,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrNbtvbtybtCbtDbtDbtzbtDbtDbtDbtzbrQaSdaSdaSdaToboRbqrbrUbtFbtGbrUbtBbtAbtHbtEbqrbtLbtMbtIblQblMbtObtPbtKbtJbtQbtNbtSbtRbtRbtRbtUbtTblMbnKbsdbtYbtZbtVbubblTblTblTblTblTbucbudbtWbufbugbnTbnObssbgSbgSbgSbtXbuebuabuibuhbujbqSbunbukbumbulbupbuoburbuqbutbusbuubuhbuwbuvbuybuxbuAbuzbuEbuEbuBbhqbuCaUSbmqbuDbuIbpKbmqbuFbuGbmqbuHbuMbpKbmqbogbofbofbofboibofbuJbofbsWbrobuKbebbuPbrrboBboAboAboBbrubuLbebbuNbuQbuObuSbuRbuUbuTbuWbuVbuVbuVbuVbuVbuVbuXbuZbuYboJboJboJboJboJboJbvdbvabvcbvbbjKbjKbjKbvebltbjKbvgbqnbwDbvhcUBbjRblDblAbeCblCbnbblAbeCblCbnbblAbeCblCblDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvibvjbvjbvjbvjbvjbvjbvjbvjbvjbvjbvfbvlaOQbvlaSfboRbqrbvmbrUbvnbvnbvnbvkbrUbvobqrbvqbvrbtIbvsbvsbvsbvsbvpbvsbvtbnDbvvbvubvwbvwbvybvxblMbvzbvBbvAbvDbvCbvFbvGbvHbvIbvHbvJbvJbvJbvJbvJbvKbvEbnObvLbvNbvMbvPbvObvRbvQbvTbvSbuobvUbvVbvXbvXbvXbvXbvWbvXbvZbwabwbbvYbvUbwdbwcbmcbwebwgbwfbwibwhbwjbhqbhqbsNbmqbwkbmqbmqbmqaZVbmqbmqbwmbwmbmqbmqbwlbofbofbwnbwobofbofbofbwqbwpbwrbebbqabrrboBboBboBboBbrubwsbebbwtbwvbwvbwwbwvbwubljbljbljbljbwybljbljbljbwzbvaboJboJboJboJboJboJboJbvdbvabvcbvbbjKboMboMboNboMbjKbwxbjRbwBbwAbwCbjRbnbblAbeCblCbnbblAbeCblCbnbblAbeCblCbnbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwFbwEbwGbwHbwIbwIbwJbwIbwIbwIbwJbrQaSdaSdaSdbwKblFbwLbrUbwMbvnbvnbvnbvkbwMbrUbqrbwNbwObtIbvsbwPbwQbwRbwSbvsbwUbwTbwVblMbwWbwXbwZbwYblMbnKbxabxbbxbbxcbxbbxbbxbbxbbxebxdbxdbxdbxfbxdbxgbxhbxibxjbxkbxlbxlbxlbxlbxlbxmbxmbxnbxmbvXbvXbxobxpbxqbxrbxtbxsbxobxubvXbxvbxwbxvbxvbxvbxvbxvbxvbxvbwjbhqbhqaUSbxxbmqbxybxzbmqbxAbmqbxBbxDbxCbmqbxEbdTbxFbxGbdTbdTbxHbxJbxIbxJbdTbdTbebblbbxLbxMbxMbxMbxMbxLbxNbebbxObwvbwvbwwbxPbaubxQbxRbxSbxTbxUbxVbxWbxXbxYaYPbxZbcDbyaboJboJbyabcDbybaYPbycbvbbjKbqlbqlbqmbqlbjKbvgbqnbwDbvhcUBbjRbqoblAbeCblCbqoblAbeCblCbqoblAbeCblCbqoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwFbrObrObrQbrObrObrObrRbrObrObydaabaSdbyebndbyfbqrbtFbtFbtFbrUbyhbygbyjbyibqrbykbylbtIbvsbymbvsbynbyobvsbyqbypbyrblMbwWbwXbwZbskblMbnKbxabxbbytbysbyubyvbywbxbbyybyxbyAbyzbyBbyBbyBbyCbyEbyDbyFbxlbyGbyHbyIbyJbyLbyKbyMbyNbvXbyObxqbxqbyPbyQbyPbxqbxqbyRbvXbySbyUbyTbyWbyVbyYbyXbyZbxvbzabzbbzbbzcaUSaUSaUSaUSbzdbsNbzdbzeaUSbdRaUSaUSbdTbdTbdTbdTbzgbzfbzfbzfbzfbzhbzibebbjBbzjbjBbzkbzkbjBbzjbjBbebbxObwvbwvbzlbxPbaubaubaubaubaubtfbaubaubaubauaYPaYOaYQaYQaYQaYQaYQaYQaYPaYPbznbzmbzobxKbjKbjMbjKbjKbzpbjRbjRbjRbjRbqnbicbzqbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwFbrObrObrQbrObrObrObrRbrObrObydaabaSdbyebndbyfbqrbtFbtFbtFbrUbyhbygbyjbyibqrbykbylbtIbvsbymbvsbynbyobvsbyqbypbyrblMbwWbwXbwZbskblMbnKbxabxbbytbysbyubyvbywbxbbyybyxbyAbyzbyBbyBbyBbyCbyEbyDbyFbxlbyGbyHbyIbyJbyLbyKbyMbyNbvXbyObxqbxqbyPbyQbyPbxqbxqbyRbvXbySbyUbyTbyWbyVbyYbyXaZObxvbzabzbbzbbzcaUSaUSaUSaUSbzdbsNbzdbzeaUSbdRaUSaUSbdTbdTbdTbdTbzgbzfbzfbzfbzfbzhbzibebbjBbzjbjBbzkbzkbjBbzjbjBbebbxObwvbwvbzlbxPbaubaubaubaubaubtfbaubaubaubauaYPaYOaYQaYQaYQaYQaYQaYQaYPaYPbznbzmbzobxKbjKbjMbjKbjKbzpbjRbjRbjRbjRbqnbicbzqbeCbeCbeCbeCbeCbeCbeCbeCbeCbeCbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabjQaLdaSdaSdaSdaMsaMsaMsaMsaMsaMsbzrbzsbqrbqrbqrbqrbqrbqrbztbqrbqrbqrbnKbnKbzwbvsbzubzvbynbzxbvsbzzbzybzAblMbwWbwXbwZbnDblMbnKbxabxbbzDbzBbzCbyvbzCbxbbyybzGbzEbzFbzIbzHbzKbzJbzMbzLbyFbzRbzNbzObzPbzQbzQbzPbzUbzSbvXbzTbxqbxqbyPbzWbyPbxqbxqbzVbwbbzXbAbbzYbzZbAabAdbzYbAcbxvbAlbAebAfbAgbAhbAibAjbAkbAkbAkbAkbAkbAkbAmbAobAnbAkbAkbAqbAkbAkbAkbAkbAkbAkbAkbAkbApbAsbArbArbArbArbArbArbAtbAibAubAvbAvbAxbAwbAybAwbAzbAwbABbAAbACbAwbAFbADbAEbAHbAGbAGbAGbAGbAGbAGbAGbAIbALbAJbAJbAKbAJbBObjKbjKbrIbAMboIbANbrMboIbAObeCbeCbeCbeCbAPbeCbAPbeCbeCbeCbeCaYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAQbARbARbARbARbASbASbARbARbATaaaaabaSdaUkaSgbAVbAUbAXbAWbAWbAWbAWbAYbAZbBablQbnwbBcbBbbvsbvsbvsbBdbyobvsblMblMblMblMbwWbBebBgbBfblMbBhbBibxbbBjbBkbyvbzCbBlbxbbyybBmbzEbzFbBnbBobBpbzJbBqbzLbyFbzRbBrbBsbBtbBubBvbBwbzUbBxbvXbBybyPbxqbBAbBzbBAbxqbyPbBBbxubBCbzYbzYbzZbBDbAdbzYbBEbxvbBFbAfbAfbAgbAhbAibAkbAkbAkbAkbAkbAkbAkbBGbAkbAkbAkbAkbAkbAkbBHbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBIbBJbBKbBLbAGbAGbBMbwvbwvbwvbwvbwvbwwbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbBNbwvbDobBPbjKbjKbBQbjKbjKbjKbjKbBUbjRbqnbjRbjRbjRbqpbjCbBWbBVbjCbBXaYUbBXaYUbBYbBRbBSbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabCabCdbCcbBZbCebCbbCbbClbCibARbATaSdaSdaSdaTobCnbCfbCgbCfbCfbCfbCfbChbCtbCjblQblQbCkbCwbvsbwPbCmbCxbzxbvsbCobCpbCoblMblMblMblMbCqblMbCrbCsbxbbCybCubzCbCvbCzbxbbyybzJbCBbzFbBnbBnbCEbzJbCFbzLbyFbzRbCAbBsbBtbCGbCCbBwbzUbCDbvXbCHbCIbxqbCKbCJbCLbxqbCRbCNbCSbCMbCTbCObCPbCQbCUbzYbCVbxvbCYbCXbAfbAgbAhbAibAkbCZbAkbAkbAkbAkbCWbDbbDbbDbbDbbDcbAkbAkbAkbAkbDdbAkbCZbDabAkbAkbDebDgbDfbDhbDibDibDlbDjbDnbDmbwvbwvbwvbwvbwvbwvbwvbDkbDpbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbwvbDrbDqbDqbDsbDubDtbDxbDvbDvbDybDAbEHbmZbAMboIbrMbrMboIbDBdsldsldsldsnbicaaabicbDDbDwbDwbDFbicaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 3f4eea3dbf4..b1cf367ba1f 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -182,10 +182,15 @@ icon_state = "nuke" /obj/structure/sign/clown - name = "\improper mech painting" + name = "\improper clown painting" desc = "A painting of the clown and mime. Awwww." icon_state = "clown" +/obj/structure/sign/bobross + name = "\improper calming painting" + desc = "We don't make mistakes, just happy little accidents." + icon_state = "bob" + /obj/structure/sign/singulo name = "\improper singulo painting" desc = "A mesmerizing painting of a singularity. It seems to suck you in..." diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi index 13913aae9bd260baf32fcacfd387e96aefe8aecc..98da468fc5615df60f4f71a610458a128fc7d859 100644 GIT binary patch delta 19447 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 From 7f404d8bed82bb8ee2253d495f04a33d01aed389 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 29 Jun 2017 15:53:03 -0400 Subject: [PATCH 34/41] Automatic changelog generation for PR #7670 [ci skip] --- html/changelogs/AutoChangeLog-pr-7670.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7670.yml diff --git a/html/changelogs/AutoChangeLog-pr-7670.yml b/html/changelogs/AutoChangeLog-pr-7670.yml new file mode 100644 index 00000000000..182f0b1460c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7670.yml @@ -0,0 +1,7 @@ +author: "Kluys" +delete-after: True +changes: + - rscadd: "Bob ross painting in the captains office called \"calming painting\". + +Also changes around the entertainment monitor and light switch to accomodate." + - bugfix: "Clown painting was named \"\\improper mech painting\"" From b33750ece817c8a06cbc71e3b6ae32bf2af37d04 Mon Sep 17 00:00:00 2001 From: fludd12 Date: Thu, 29 Jun 2017 17:24:57 -0400 Subject: [PATCH 35/41] Fixes the last fixes --- code/modules/mob/living/carbon/human/human_defense.dm | 3 --- code/modules/mob/living/carbon/human/species/species.dm | 3 ++- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 9e8fcf8d50b..6a63a30fc5c 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -468,8 +468,5 @@ emp_act ..() /mob/living/carbon/human/water_act(volume, temperature, source) - ..() - if(temperature >= 330) bodytemperature = bodytemperature + (temperature - bodytemperature) - if(temperature <= 280) bodytemperature = bodytemperature - (bodytemperature - temperature) species.water_act(src,volume,temperature,source) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 76000a4c431..8320136e2be 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -679,4 +679,5 @@ It'll return null if the organ doesn't correspond, so include null checks when u H.see_invisible = H.see_override /datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source) - return \ No newline at end of file + if(temperature >= 330) M.bodytemperature = M.bodytemperature + (temperature - M.bodytemperature) + if(temperature <= 280) M.bodytemperature = M.bodytemperature - (M.bodytemperature - temperature) \ No newline at end of file From ecf597aa44191dd4d8c73261f6679691ab6d0c19 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 29 Jun 2017 18:02:30 -0400 Subject: [PATCH 36/41] Automatic changelog compile, [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 5 +++++ html/changelogs/AutoChangeLog-pr-7670.yml | 7 ------- 3 files changed, 11 insertions(+), 7 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-7670.yml diff --git a/html/changelog.html b/html/changelog.html index afa450bfa5f..32acb18bdb1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -60,6 +60,12 @@
          • Fixes limbs being an open wound after augmentation
          +

          Kluys updated:

          +
            +
          • Bob ross painting in the captains office called "calming painting". +Also changes around the entertainment monitor and light switch to accomodate.
          • +
          • Clown painting was named "\improper mech painting"
          • +

          28 June 2017

          Fox McCloud updated:

          diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index ed6871bcdcb..eb525938e29 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -5062,3 +5062,8 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2017-06-29: Fox McCloud: - bugfix: Fixes limbs being an open wound after augmentation + Kluys: + - rscadd: 'Bob ross painting in the captains office called "calming painting". + + Also changes around the entertainment monitor and light switch to accomodate.' + - bugfix: Clown painting was named "\improper mech painting" diff --git a/html/changelogs/AutoChangeLog-pr-7670.yml b/html/changelogs/AutoChangeLog-pr-7670.yml deleted file mode 100644 index 182f0b1460c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-7670.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Kluys" -delete-after: True -changes: - - rscadd: "Bob ross painting in the captains office called \"calming painting\". - -Also changes around the entertainment monitor and light switch to accomodate." - - bugfix: "Clown painting was named \"\\improper mech painting\"" From 61ac035415a45de70b5a047687cbcf49dbdbb808 Mon Sep 17 00:00:00 2001 From: fludd12 Date: Fri, 30 Jun 2017 01:00:06 -0400 Subject: [PATCH 37/41] Fixes the last fixes of the last fixes frick why --- code/modules/mob/living/carbon/human/human_defense.dm | 1 + code/modules/mob/living/carbon/human/species/species.dm | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 6a63a30fc5c..fa31b3bc52b 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -468,5 +468,6 @@ emp_act ..() /mob/living/carbon/human/water_act(volume, temperature, source) + ..() species.water_act(src,volume,temperature,source) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 8320136e2be..30bcdd1914a 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -679,5 +679,7 @@ It'll return null if the organ doesn't correspond, so include null checks when u H.see_invisible = H.see_override /datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source) - if(temperature >= 330) M.bodytemperature = M.bodytemperature + (temperature - M.bodytemperature) - if(temperature <= 280) M.bodytemperature = M.bodytemperature - (M.bodytemperature - temperature) \ No newline at end of file + if(temperature >= 330) + M.bodytemperature = M.bodytemperature + (temperature - M.bodytemperature) + if(temperature <= 280) + M.bodytemperature = M.bodytemperature - (M.bodytemperature - temperature) \ No newline at end of file From 98beeb1065f77fbb9abeb1a181784d7004f6a3b0 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 30 Jun 2017 11:29:32 -0400 Subject: [PATCH 38/41] Automatic changelog generation for PR #6516 [ci skip] --- html/changelogs/AutoChangeLog-pr-6516.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6516.yml diff --git a/html/changelogs/AutoChangeLog-pr-6516.yml b/html/changelogs/AutoChangeLog-pr-6516.yml new file mode 100644 index 00000000000..e96e2a6470a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6516.yml @@ -0,0 +1,7 @@ +author: "fludd12" +delete-after: True +changes: + - tweak: "Greys treat Sulfuric Acid as if it were water. They also treat water as if it were sulfuric acid." + - experiment: "Grey language is now Z-level wide, but requires you to be able to put a finger to your temple. (Requires at least one hand not disabled and not stunned.)" + - tweak: "Remote Talk is buffed to have a range of two screens, and has some minor formatting changes!" + - bugfix: "Remote Talk no longer lets you magically know the true name of whoever you speak with." From 6abcbc7b94f21be06373d6584adceb418a67412d Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 30 Jun 2017 12:49:19 -0400 Subject: [PATCH 39/41] Automatic changelog compile, [ci skip] --- html/changelog.html | 9 +++++++++ html/changelogs/.all_changelog.yml | 11 +++++++++++ html/changelogs/AutoChangeLog-pr-6516.yml | 7 ------- 3 files changed, 20 insertions(+), 7 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-6516.yml diff --git a/html/changelog.html b/html/changelog.html index 32acb18bdb1..baba4a216ef 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,15 @@ -->
          +

          30 June 2017

          +

          fludd12 updated:

          +
            +
          • Greys treat Sulfuric Acid as if it were water. They also treat water as if it were sulfuric acid.
          • +
          • Grey language is now Z-level wide, but requires you to be able to put a finger to your temple. (Requires at least one hand not disabled and not stunned.)
          • +
          • Remote Talk is buffed to have a range of two screens, and has some minor formatting changes!
          • +
          • Remote Talk no longer lets you magically know the true name of whoever you speak with.
          • +
          +

          29 June 2017

          Fox McCloud updated:

            diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index eb525938e29..ac07255e3f8 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -5067,3 +5067,14 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. Also changes around the entertainment monitor and light switch to accomodate.' - bugfix: Clown painting was named "\improper mech painting" +2017-06-30: + fludd12: + - tweak: Greys treat Sulfuric Acid as if it were water. They also treat water as + if it were sulfuric acid. + - experiment: Grey language is now Z-level wide, but requires you to be able to + put a finger to your temple. (Requires at least one hand not disabled and not + stunned.) + - tweak: Remote Talk is buffed to have a range of two screens, and has some minor + formatting changes! + - bugfix: Remote Talk no longer lets you magically know the true name of whoever + you speak with. diff --git a/html/changelogs/AutoChangeLog-pr-6516.yml b/html/changelogs/AutoChangeLog-pr-6516.yml deleted file mode 100644 index e96e2a6470a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-6516.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "fludd12" -delete-after: True -changes: - - tweak: "Greys treat Sulfuric Acid as if it were water. They also treat water as if it were sulfuric acid." - - experiment: "Grey language is now Z-level wide, but requires you to be able to put a finger to your temple. (Requires at least one hand not disabled and not stunned.)" - - tweak: "Remote Talk is buffed to have a range of two screens, and has some minor formatting changes!" - - bugfix: "Remote Talk no longer lets you magically know the true name of whoever you speak with." From 04b9394d34f2ff722689b8bd12810fef4ad8a826 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sat, 1 Jul 2017 01:44:02 -0400 Subject: [PATCH 40/41] last tweaks --- code/datums/spells/summonitem.dm | 2 +- code/game/objects/items.dm | 1 - code/game/objects/items/weapons/kitchen.dm | 1 - .../objects/items/weapons/melee/energy.dm | 1 - code/game/objects/items/weapons/shards.dm | 25 +----------------- code/game/objects/items/weapons/twohanded.dm | 5 ---- .../mob/living/carbon/human/human_defense.dm | 16 +---------- .../living/silicon/robot/drone/drone_items.dm | 4 --- code/modules/projectiles/guns/alien.dm | 1 - .../projectiles/guns/throw/crossbow.dm | 2 -- code/modules/projectiles/projectile.dm | 1 - .../modules/projectiles/projectile/bullets.dm | 10 ------- code/modules/projectiles/projectile/force.dm | 1 - .../projectiles/projectile/reusable.dm | 1 - icons/obj/shards.dmi | Bin 3883 -> 4132 bytes 15 files changed, 3 insertions(+), 68 deletions(-) diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm index bb650eb17f9..7524e7f31d6 100644 --- a/code/datums/spells/summonitem.dm +++ b/code/datums/spells/summonitem.dm @@ -83,7 +83,7 @@ var/obj/item/organ/external/part = X if(item_to_retrive in part.embedded_objects) part.embedded_objects -= item_to_retrive - to_chat(C, "The [item_to_retrive] that was embedded in your [part] has myseriously vanished. How fortunate!") + to_chat(C, "The [item_to_retrive] that was embedded in your [part] has mysteriously vanished. How fortunate!") if(!C.has_embedded_objects()) C.clear_alert("embeddedobject") break diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 030d073781f..294dda0d674 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -4,7 +4,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d name = "item" icon = 'icons/obj/items.dmi' var/discrete = 0 // used in item_attack.dm to make an item not show an attack message to viewers - var/no_embed = 0 // For use in item_attack.dm var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite var/blood_overlay_color = null var/item_state = null diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 13bc85999e0..e61ca62831c 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -98,7 +98,6 @@ throw_range = 6 materials = list(MAT_METAL=12000) attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - no_embed = 1 sharp = 1 edge = 1 diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index edd07bef05a..6177c999393 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -6,7 +6,6 @@ var/w_class_on = WEIGHT_CLASS_BULKY var/icon_state_on = "axe1" var/list/attack_verb_on = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - no_embed = 1 // Physically impossible for energy weapons to embed themselves into people, this should fix that. -- Dave hitsound = 'sound/weapons/blade1.ogg' // Probably more appropriate than the previous hitsound. -- Dave usesound = 'sound/weapons/blade1.ogg' toolspeed = 1 diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm index 8129eca79dc..272e66ee11a 100644 --- a/code/game/objects/items/weapons/shards.dm +++ b/code/game/objects/items/weapons/shards.dm @@ -88,27 +88,4 @@ if(affecting.take_damage(5, 0)) H.UpdateDamageIcon() H.updatehealth() - ..() - -// Shrapnel - -/obj/item/weapon/shard/shrapnel - name = "shrapnel" - icon = 'icons/obj/shards.dmi' - icon_state = "shrapnellarge" - desc = "A bunch of tiny bits of shattered metal." - embedded_fall_chance = 0 - -/obj/item/weapon/shard/shrapnel/New() - ..() - icon_state = pick("shrapnellarge", "shrapnelmedium", "shrapnelsmall") - switch(icon_state) - if("shrapnelsmall") - pixel_x = rand(-12, 12) - pixel_y = rand(-12, 12) - if("shrapnelmedium") - pixel_x = rand(-8, 8) - pixel_y = rand(-8, 8) - if("shrapnellarge") - pixel_x = rand(-5, 5) - pixel_y = rand(-5, 5) \ No newline at end of file + ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index cdd8b8a5de1..9f4ebf36611 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -210,7 +210,6 @@ block_chance = 75 sharp = 1 edge = 1 - no_embed = 1 // Like with the single-handed esword, this shouldn't be embedding in people. /obj/item/weapon/twohanded/dualsaber/New() blade_color = pick("red", "blue", "green", "purple") @@ -500,7 +499,6 @@ attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered") sharp = 1 edge = 1 - no_embed = 1 /obj/item/weapon/twohanded/chainsaw/update_icon() if(wielded) @@ -539,7 +537,6 @@ icon_state = "mjollnir0" flags = CONDUCT slot_flags = SLOT_BACK - no_embed = 1 force = 5 force_unwielded = 5 force_wielded = 20 @@ -604,7 +601,6 @@ icon_state = "mjollnir0" flags = CONDUCT slot_flags = SLOT_BACK - no_embed = 1 force = 5 force_unwielded = 5 force_wielded = 25 @@ -652,7 +648,6 @@ icon_state = "knighthammer0" flags = CONDUCT slot_flags = SLOT_BACK - no_embed = 1 force = 5 force_unwielded = 5 force_wielded = 30 diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index b5f5f0f5ef2..917d9d9b0f7 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -8,7 +8,7 @@ emp_act */ -/mob/living/carbon/human/bullet_act(var/obj/item/projectile/P, var/def_zone) +/mob/living/carbon/human/bullet_act(obj/item/projectile/P, def_zone) if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) if(check_reflect(def_zone)) // Checks if you've passed a reflection% check @@ -41,20 +41,6 @@ emp_act . = bullet_act(P, "chest") //act on chest instead return - //Shrapnel - if(P.damage_type == BRUTE) - var/armor = getarmor_organ(organ, "bullet") - if((P.embed && prob(20 + max(P.damage - armor, -10)))) - var/obj/item/weapon/shard/shrapnel/SP = new() - SP.name = "[P.name] shrapnel" - if(P.ammo_casing && P.ammo_casing.caliber) - SP.desc = "[SP.desc] It looks like it is a [P.ammo_casing.caliber] caliber round." - else - SP.desc = "[SP.desc] The round's caliber is unidentifiable." - throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) - organ.embedded_objects |= SP - SP.forceMove(src) - organ.add_autopsy_data(P.name, P.damage) // Add the bullet's name to the autopsy data return (..(P , def_zone)) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 16c8f1a3ef0..3454a6597ab 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -260,10 +260,6 @@ stored_comms["glass"]++ else if(istype(W,/obj/item/ammo_casing)) stored_comms["metal"]++ - else if(istype(W,/obj/item/weapon/shard/shrapnel)) - stored_comms["metal"]++ - stored_comms["metal"]++ - stored_comms["metal"]++ else if(istype(W,/obj/item/weapon/shard)) stored_comms["glass"]++ stored_comms["glass"]++ diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm index f541ca2a94a..5900e9a249e 100644 --- a/code/modules/projectiles/guns/alien.dm +++ b/code/modules/projectiles/guns/alien.dm @@ -101,6 +101,5 @@ flag = "bullet" pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - embed = 0 weaken = 5 stun = 5 diff --git a/code/modules/projectiles/guns/throw/crossbow.dm b/code/modules/projectiles/guns/throw/crossbow.dm index 77d3e89eade..a06aac35be5 100644 --- a/code/modules/projectiles/guns/throw/crossbow.dm +++ b/code/modules/projectiles/guns/throw/crossbow.dm @@ -170,8 +170,6 @@ /obj/item/weapon/arrow/rod/removed() if(superheated) // The rod has been superheated - we don't want it to be useable when removed from the bow. visible_message("[src] shatters into a scattering of overstressed metal shards as it leaves the crossbow.") - var/obj/item/weapon/shard/shrapnel/S = new /obj/item/weapon/shard/shrapnel - S.loc = get_turf(src) qdel(src) #undef XBOW_TENSION_20 diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 4a3afd18684..20957e18786 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -48,7 +48,6 @@ var/drowsy = 0 var/stamina = 0 var/jitter = 0 - var/embed = 0 // whether or not the projectile can embed itself in the mob var/forcedodge = 0 //to pass through everything var/dismemberment = 0 //The higher the number, the greater the bonus to dismembering. 0 will not dismember at all. diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 7434038eb91..2c55431fba0 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -4,7 +4,6 @@ damage = 60 damage_type = BRUTE flag = "bullet" - embed = 1 sharp = 1 hitsound_wall = "ricochet" @@ -14,11 +13,9 @@ stamina = 80 /obj/item/projectile/bullet/weakbullet/rubber //beanbag that shells that don't embed - embed = 0 sharp = 0 /obj/item/projectile/bullet/weakbullet/booze - embed = 0 /obj/item/projectile/bullet/weakbullet/booze/on_hit(atom/target, blocked = 0) if(..(target, blocked)) @@ -45,7 +42,6 @@ icon_state = "bullet-r" /obj/item/projectile/bullet/weakbullet2/rubber //detective's bullets that don't embed - embed = 0 sharp = 0 /obj/item/projectile/bullet/weakbullet3 @@ -56,7 +52,6 @@ damage = 5 stamina = 30 icon_state = "bullet-r" - embed = 0 sharp = 0 /obj/item/projectile/bullet/toxinbullet @@ -145,7 +140,6 @@ name = "rubber pellet" damage = 3 stamina = 25 - embed = 0 sharp = 0 icon_state = "bullet-r" @@ -157,7 +151,6 @@ stutter = 5 jitter = 20 range = 7 - embed = 0 sharp = 0 icon_state = "spark" color = "#FFFF00" @@ -209,7 +202,6 @@ stun = 5 forcedodge = 1 nodamage = 1 - embed = 0 sharp = 0 pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE hitsound = 'sound/items/bikehorn.ogg' @@ -244,7 +236,6 @@ name = "dart" icon_state = "cbbolt" damage = 6 - embed = 0 sharp = 0 var/piercing = 0 @@ -307,7 +298,6 @@ name = "cap" damage = 0 nodamage = 1 - embed = 0 sharp = 0 /obj/item/projectile/bullet/cap/fire() diff --git a/code/modules/projectiles/projectile/force.dm b/code/modules/projectiles/projectile/force.dm index 4e5c6d27700..4d62550a852 100644 --- a/code/modules/projectiles/projectile/force.dm +++ b/code/modules/projectiles/projectile/force.dm @@ -4,7 +4,6 @@ icon_state = "ice_1" damage = 20 flag = "energy" - embed = 1 /obj/item/projectile/forcebolt/strong name = "force bolt" diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable.dm index a223f415165..8592a7a46ee 100644 --- a/code/modules/projectiles/projectile/reusable.dm +++ b/code/modules/projectiles/projectile/reusable.dm @@ -36,7 +36,6 @@ range = 10 var/obj/item/weapon/pen/pen = null edge = 0 - embed = 0 log_override = TRUE//it won't log even when there's a pen inside, but since the damage will be so low, I don't think there's any point in making it any more complex /obj/item/projectile/bullet/reusable/foam_dart/handle_drop() diff --git a/icons/obj/shards.dmi b/icons/obj/shards.dmi index 1b979682adc2ffe3365b26cba90c15b9c897d2ef..5ce7113bf88eaea10b10d73daebc8eb122dbefd9 100644 GIT binary patch literal 4132 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 Ux?cPSfBOM_ZDXx!4F}x+0Uv0$+W-In literal 3883 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 G Date: Sat, 1 Jul 2017 20:05:07 -0400 Subject: [PATCH 41/41] Automatic changelog generation for PR #7480 [ci skip] --- html/changelogs/AutoChangeLog-pr-7480.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-7480.yml diff --git a/html/changelogs/AutoChangeLog-pr-7480.yml b/html/changelogs/AutoChangeLog-pr-7480.yml new file mode 100644 index 00000000000..324e8a777d4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-7480.yml @@ -0,0 +1,6 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Re-enables object embedding system; embedding objects now cause more damage than before" + - rscadd: "Adds in throwing stars kit to the traitor uplink" + - rscdel: "bullets no longer leave shrapnel"