From 03d79a1b65105ccc9ac84decd0e25e2e2b2f91d8 Mon Sep 17 00:00:00 2001 From: Cirno Date: Mon, 29 Jun 2020 18:52:21 -0300 Subject: [PATCH 001/122] I think this changed pills? --- code/game/objects/items/storage/firstaid.dm | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index d7065df0f0..596ae9ea5a 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -229,6 +229,21 @@ STR.click_gather = TRUE STR.can_hold = typecacheof(list(/obj/item/reagent_containers/pill, /obj/item/dice)) + +/obj/item/storage/pill_bottle/AltClick(mob/living/carbon/user) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return + var/obj/item/reagent_containers/pill/W = locate(/obj/item/reagent_containers/pill) in contents + if(W && contents.len > 0) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, user) + user.put_in_hands(W) + contents -= W + to_chat(user, "You pop \a [W] out of the bottle.") + else + to_chat(user, "There are no pills left in the bottle.") + return TRUE + + /obj/item/storage/pill_bottle/suicide_act(mob/user) user.visible_message("[user] is trying to get the cap off [src]! It looks like [user.p_theyre()] trying to commit suicide!") return (TOXLOSS) From 020da9fa0789ff87fe1ad0da7542f65d16c97caa Mon Sep 17 00:00:00 2001 From: Cirno Date: Sat, 4 Jul 2020 15:47:38 -0300 Subject: [PATCH 002/122] i hope this works --- _maps/RandomRuins/SpaceRuins/spacehotel.dmm | 2 +- _maps/RandomZLevels/away_mission/research.dmm | 2 +- _maps/map_files/generic/CentCom.dmm | 4 ++-- _maps/shuttles/arrival_delta.dmm | 2 +- _maps/shuttles/arrival_omega.dmm | 2 +- code/game/objects/effects/spawners/lootdrop.dm | 4 ++-- code/game/objects/items/RSF.dm | 2 +- code/game/objects/items/dice.dm | 6 +++--- code/modules/mining/equipment/survival_pod.dm | 2 +- code/modules/vending/games.dm | 2 +- modular_citadel/code/modules/client/loadout/hands.dm | 2 +- 11 files changed, 15 insertions(+), 15 deletions(-) diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm index 209feb82e3..b946f0bde3 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm @@ -1453,7 +1453,7 @@ /area/ruin/space/has_grav/hotel/guestroom/room_2) "eu" = ( /obj/structure/table/wood, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_2) "ev" = ( diff --git a/_maps/RandomZLevels/away_mission/research.dmm b/_maps/RandomZLevels/away_mission/research.dmm index 4f85d084b5..c4aad6b9dd 100644 --- a/_maps/RandomZLevels/away_mission/research.dmm +++ b/_maps/RandomZLevels/away_mission/research.dmm @@ -5395,7 +5395,7 @@ /area/awaymission/research/interior/dorm) "kS" = ( /obj/structure/table/wood, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /turf/open/floor/plasteel, /area/awaymission/research/interior/dorm) "kT" = ( diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index f82ba2d735..338e0eb7b6 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -8429,7 +8429,7 @@ /area/centcom/ferry) "tx" = ( /obj/structure/table/wood, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /turf/open/floor/plasteel/grimy, /area/centcom/ferry) "ty" = ( @@ -10217,7 +10217,7 @@ /area/wizard_station) "xy" = ( /obj/structure/table/wood/fancy, -/obj/item/storage/pill_bottle/dice{ +/obj/item/storage/box/dice{ icon_state = "magicdicebag" }, /turf/open/floor/carpet, diff --git a/_maps/shuttles/arrival_delta.dmm b/_maps/shuttles/arrival_delta.dmm index 62e30ef335..d167e31a52 100644 --- a/_maps/shuttles/arrival_delta.dmm +++ b/_maps/shuttles/arrival_delta.dmm @@ -307,7 +307,7 @@ "D" = ( /obj/structure/table/reinforced, /obj/item/folder, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/shuttle/arrival) diff --git a/_maps/shuttles/arrival_omega.dmm b/_maps/shuttles/arrival_omega.dmm index f580149163..780f8e3fe6 100644 --- a/_maps/shuttles/arrival_omega.dmm +++ b/_maps/shuttles/arrival_omega.dmm @@ -237,7 +237,7 @@ /area/shuttle/arrival) "C" = ( /obj/structure/table/reinforced, -/obj/item/storage/pill_bottle/dice{ +/obj/item/storage/box/dice{ pixel_x = -2; pixel_y = 8 }, diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 2c7f701a6e..8978da7a22 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -466,7 +466,7 @@ /obj/effect/spawner/lootdrop/cigars_cases/no_turf = 2, /obj/effect/spawner/lootdrop/space_cash/no_turf = 5, /obj/item/reagent_containers/food/snacks/grown/cannabis = 5, - /obj/item/storage/pill_bottle/dice = 5, + /obj/item/storage/box/dice = 5, /obj/item/toy/cards/deck = 5, /obj/effect/spawner/lootdrop/druggie_pill/no_turf = 5 ) @@ -485,7 +485,7 @@ /obj/effect/spawner/lootdrop/cig_packs/no_turf = 10, /obj/effect/spawner/lootdrop/cigars_cases/no_turf = 5, /obj/item/reagent_containers/food/snacks/grown/cannabis = 5, - /obj/item/storage/pill_bottle/dice = 5, + /obj/item/storage/box/dice = 5, /obj/item/toy/cards/deck = 5, /obj/effect/spawner/lootdrop/druggie_pill/no_turf = 5, /obj/item/kitchen/knife = 5, diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm index 01b351edd0..b1a4e53bd4 100644 --- a/code/game/objects/items/RSF.dm +++ b/code/game/objects/items/RSF.dm @@ -91,7 +91,7 @@ RSF use_matter(50, user) if(4) to_chat(user, "Dispensing Dice Pack...") - new /obj/item/storage/pill_bottle/dice(T) + new /obj/item/storage/box/dice(T) use_matter(200, user) if(5) to_chat(user, "Dispensing Cigarette...") diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index 4fdb862288..2fe4c67362 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -1,10 +1,10 @@ -/obj/item/storage/pill_bottle/dice +/obj/item/storage/box/dice name = "bag of dice" desc = "Contains all the luck you'll ever need." icon = 'icons/obj/dice.dmi' icon_state = "dicebag" -/obj/item/storage/pill_bottle/dice/Initialize() +/obj/item/storage/box/dice/Initialize() . = ..() var/special_die = pick("1","2","fudge","space","00","8bd20","4dd6","100") if(special_die == "1") @@ -30,7 +30,7 @@ if(special_die == "100") new /obj/item/dice/d100(src) -/obj/item/storage/pill_bottle/dice/suicide_act(mob/user) +/obj/item/storage/box/dice/suicide_act(mob/user) user.visible_message("[user] is gambling with death! It looks like [user.p_theyre()] trying to commit suicide!") return (OXYLOSS) diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index ab0356aa66..7e324382c3 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -204,7 +204,7 @@ var/obj/item/reagent_containers/food/snacks/donkpocket/warm/W = new(src) load(W) if(prob(50)) - var/obj/item/storage/pill_bottle/dice/D = new(src) + var/obj/item/storage/box/dice/D = new(src) load(D) else var/obj/item/instrument/guitar/G = new(src) diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index 7bed27b0bd..7fd8246dd6 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -4,7 +4,7 @@ product_ads = "Escape to a fantasy world!;Fuel your gambling addiction!;Ruin your friendships!;Roll for initiative!;Elves and dwarves!;Paranoid computers!;Totally not satanic!;Fun times forever!" icon_state = "games" products = list(/obj/item/toy/cards/deck = 5, - /obj/item/storage/pill_bottle/dice = 10, + /obj/item/storage/box/dice = 10, /obj/item/toy/cards/deck/cas = 3, /obj/item/toy/cards/deck/cas/black = 3, /obj/item/toy/cards/deck/unum = 3) diff --git a/modular_citadel/code/modules/client/loadout/hands.dm b/modular_citadel/code/modules/client/loadout/hands.dm index 3b07ecaec5..2f03bd3b07 100644 --- a/modular_citadel/code/modules/client/loadout/hands.dm +++ b/modular_citadel/code/modules/client/loadout/hands.dm @@ -11,7 +11,7 @@ /datum/gear/dice name = "Dice bag" category = SLOT_HANDS - path = /obj/item/storage/pill_bottle/dice + path = /obj/item/storage/box/dice /datum/gear/eightball name = "Magic eightball" From bd289d0edbea2f55298405473fa15f46a587cd08 Mon Sep 17 00:00:00 2001 From: Cirno Date: Sun, 5 Jul 2020 00:08:33 -0300 Subject: [PATCH 003/122] more map changes... --- _maps/map_files/BoxStation/BoxStation.dmm | 4 ++-- _maps/map_files/Deltastation/DeltaStation2.dmm | 12 ++++++------ _maps/map_files/MetaStation/MetaStation.dmm | 8 ++++---- _maps/map_files/OmegaStation/OmegaStation.dmm | 4 ++-- _maps/map_files/PubbyStation/PubbyStation.dmm | 4 ++-- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 2902cf12c4..f34ecf8d73 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -350,7 +350,7 @@ /area/security/prison) "aaV" = ( /obj/structure/table/wood, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /turf/open/floor/plasteel, /area/security/prison) "aaW" = ( @@ -54949,7 +54949,7 @@ /area/engine/atmos) "hgO" = ( /obj/structure/table, -/obj/item/storage/pill_bottle/dice{ +/obj/item/storage/box/dice{ pixel_x = 4; pixel_y = 4 }, diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 8a4b5f8130..b9dbf19eff 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -19546,7 +19546,7 @@ /area/security/prison) "aND" = ( /obj/structure/table, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -20242,7 +20242,7 @@ /area/crew_quarters/bar/atrium) "aOJ" = ( /obj/structure/table/wood, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -72672,7 +72672,7 @@ /area/library) "ctL" = ( /obj/structure/table/wood, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /obj/machinery/computer/security/telescreen/entertainment{ pixel_y = -32 }, @@ -94731,7 +94731,7 @@ /area/medical/medbay/central) "deG" = ( /obj/structure/table/wood, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /obj/structure/sign/poster/official/help_others{ pixel_x = -32 }, @@ -116361,7 +116361,7 @@ /area/library/abandoned) "dQx" = ( /obj/structure/table/wood, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /turf/open/floor/carpet, /area/library/abandoned) "dQy" = ( @@ -122603,7 +122603,7 @@ /area/hallway/secondary/exit/departure_lounge) "ecH" = ( /obj/structure/table, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index c08670c2c0..6e21b6c72e 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -922,7 +922,7 @@ /area/security/prison) "acb" = ( /obj/structure/table, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /turf/open/floor/plasteel, /area/security/prison) "acc" = ( @@ -15603,7 +15603,7 @@ /area/crew_quarters/dorms) "aDZ" = ( /obj/structure/table, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /turf/open/floor/plasteel, /area/crew_quarters/dorms) "aEa" = ( @@ -21182,7 +21182,7 @@ /area/crew_quarters/locker) "aPI" = ( /obj/structure/table, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aPJ" = ( @@ -42467,7 +42467,7 @@ dir = 10 }, /obj/structure/table/wood/poker, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /turf/open/floor/wood, /area/crew_quarters/bar) "bFt" = ( diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index ebdda21c5e..2ff1c2dc2f 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -21581,7 +21581,7 @@ /area/hallway/primary/starboard) "aJa" = ( /obj/structure/table, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /obj/machinery/firealarm{ dir = 4; pixel_x = -24 @@ -26467,7 +26467,7 @@ "aTf" = ( /obj/structure/table/wood, /obj/item/clipboard, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 18d1b115a4..e9639b22ec 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -1665,7 +1665,7 @@ /turf/open/floor/plasteel/dark, /area/security/prison) "afp" = ( -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /obj/structure/table, /turf/open/floor/plasteel/dark, /area/security/prison) @@ -10373,7 +10373,7 @@ /area/crew_quarters/dorms) "ayo" = ( /obj/structure/table/wood, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /turf/open/floor/carpet, /area/crew_quarters/dorms) "ayq" = ( From 2553ef6dd8229fc9b5a603d1d091b175dc13f812 Mon Sep 17 00:00:00 2001 From: Cirno Date: Sun, 5 Jul 2020 00:46:56 -0300 Subject: [PATCH 004/122] Am I finally free? --- code/game/objects/items/storage/firstaid.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 596ae9ea5a..7deda5da27 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -229,7 +229,6 @@ STR.click_gather = TRUE STR.can_hold = typecacheof(list(/obj/item/reagent_containers/pill, /obj/item/dice)) - /obj/item/storage/pill_bottle/AltClick(mob/living/carbon/user) if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return From 6af75197270ac4579fd4353c72034f3ea36fed95 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Thu, 9 Jul 2020 23:04:06 -0700 Subject: [PATCH 005/122] Update turnstile.dm --- code/game/machinery/turnstile.dm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/turnstile.dm b/code/game/machinery/turnstile.dm index 9bc5193bbb..3e62667c7b 100644 --- a/code/game/machinery/turnstile.dm +++ b/code/game/machinery/turnstile.dm @@ -18,9 +18,6 @@ /obj/machinery/turnstile/CanAtmosPass(turf/T) return TRUE -/obj/machinery/turnstile/bullet_act(obj/item/projectile/P, def_zone) - return BULLET_ACT_FORCE_PIERCE //Pass through! - /obj/machinery/turnstile/proc/allowed_access(var/mob/B) if(B.pulledby && ismob(B.pulledby)) return allowed(B.pulledby) | allowed(B) @@ -28,6 +25,8 @@ return allowed(B) /obj/machinery/turnstile/CanPass(atom/movable/AM, turf/T) + if(istype(AM, /obj/item/projectile)) + return TRUE if(ismob(AM)) var/mob/B = AM if(isliving(AM)) @@ -81,4 +80,4 @@ M.last_bumped = world.time return canexit else - return TRUE \ No newline at end of file + return TRUE From 8686029009cdcaf2871b3d1d762dcd3c0e142701 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Thu, 9 Jul 2020 23:04:58 -0700 Subject: [PATCH 006/122] Update turnstile.dm --- code/game/machinery/turnstile.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/machinery/turnstile.dm b/code/game/machinery/turnstile.dm index 3e62667c7b..f30ef22dd7 100644 --- a/code/game/machinery/turnstile.dm +++ b/code/game/machinery/turnstile.dm @@ -59,6 +59,8 @@ return FALSE /obj/machinery/turnstile/CheckExit(atom/movable/AM as mob|obj, target) + if(istype(AM, /obj/item/projectile)) + return TRUE if(isliving(AM)) var/mob/living/M = AM var/outdir = dir From 9c9c611285bc3b81e55a2b21ea6bc55da0543846 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Thu, 9 Jul 2020 23:34:35 -0700 Subject: [PATCH 007/122] ok --- code/controllers/subsystem/vote.dm | 52 +++++++++++++++++++++++++++++- code/modules/mob/mob.dm | 2 ++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 97a5ec2c2b..c8a48ef188 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -15,6 +15,8 @@ SUBSYSTEM_DEF(vote) var/vote_system = PLURALITY_VOTING var/question = null var/list/choices = list() + /// List of choice = object for statclick objects for statpanel voting + var/list/choice_statclicks = list() var/list/scores = list() var/list/choice_descs = list() // optional descriptions var/list/voted = list() @@ -47,7 +49,32 @@ SUBSYSTEM_DEF(vote) client_popup.open(0) next_pop = world.time+VOTE_COOLDOWN - +/** + * Renders a statpanel. Directly uses statpanel/stat calls since this is called from base of mob/Stat(). + */ +/datum/controller/subsystem/vote/proc/render_statpanel(mob/M) + if(!mode) // check if vote is running + return + if(!statpanel("Vote")) // don't bother if they're not focused on this panel + return + var/static/list/supported = list(PLURALITY_VOTING, APPROVAL_VOTING) + if(!(vote_system in supported)) + stat("Vote Manually!", "The current vote system is not supported by statpanel rendering. Please vote manually by opening the vote popup using the action button or chat link.") + return + stat("Time Left:", "[round(end_time - world.time)] seconds") + stat("Question:", question) + stat(null, null) + stat("Choices:", null) + stat(null, null) + for(var/i in 1 to choice_statclicks.len) + var/choice = choice_statclicks[i] + var/ivotedforthis = FALSE + switch(vote_system) + if(APPROVAL_VOTING) + ivotedforthis = voted[usr.ckey] && (i in voted[usr.ckey]) + if(PLURALITY_VOTING) + ivotedforthis = voted[usr.ckey] == i + stat(ivotedforthis? "\[X\]" : "\[ \]", choice_statclicks[choice]) /datum/controller/subsystem/vote/proc/reset() initiator = null @@ -59,9 +86,26 @@ SUBSYSTEM_DEF(vote) voted.Cut() voting.Cut() scores.Cut() + cleanup_statclicks() display_votes = initial(display_votes) //CIT CHANGE - obfuscated votes remove_action_buttons() +/datum/controller/subsystem/vote/proc/cleanup_statclicks() + for(var/choice in choice_statclicks) + qdel(choice_statclicks[choice]) + choice_statclicks = list() + +/obj/effect/statclick/vote + name = "ERROR" + var/choice + +/obj/effect/statclick/vote/Click() + SSvote.submit_vote(choice) + +/obj/effect/statclick/vote/New(loc, choice, name) + src.choice = choice + src.name = name + /datum/controller/subsystem/vote/proc/get_result() //get the highest number of votes var/greatest_votes = 0 @@ -536,6 +580,12 @@ SUBSYSTEM_DEF(vote) vp = CONFIG_GET(number/vote_period) to_chat(world, "\n[text]\nType vote or click here to place your votes.\nYou have [DisplayTimeText(vp)] to vote.") end_time = started_time+vp + // generate statclick list + cleanup_statclicks() + for(var/i in 1 to choices.len) + var/choice = choices[i] + choice_statclicks[choice] = new /obj/effect/statclick/vote(null, i, choice) + // for(var/c in GLOB.clients) SEND_SOUND(c, sound('sound/misc/server-ready.ogg')) var/client/C = c diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index fd9afc91cd..d81ddec271 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -539,6 +539,8 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) /mob/Stat() ..() + SSvote?.render_statpanel(src) + //This is only called from client/Stat(), let's assume client exists. if(statpanel("Status")) From 2940f0efa5ef891cc076776ce80fcc4e6cd100fe Mon Sep 17 00:00:00 2001 From: Chiirno <43803700+Chiirno@users.noreply.github.com> Date: Fri, 10 Jul 2020 02:35:42 -0400 Subject: [PATCH 008/122] Update code/game/objects/items/storage/firstaid.dm Co-authored-by: silicons <2003111+silicons@users.noreply.github.com> --- code/game/objects/items/storage/firstaid.dm | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 7deda5da27..34c1a6b280 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -232,12 +232,17 @@ /obj/item/storage/pill_bottle/AltClick(mob/living/carbon/user) if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return - var/obj/item/reagent_containers/pill/W = locate(/obj/item/reagent_containers/pill) in contents - if(W && contents.len > 0) - SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, user) - user.put_in_hands(W) - contents -= W - to_chat(user, "You pop \a [W] out of the bottle.") + if(!length(user.get_empty_held_indexes())) + to_chat(user, "Your hands are full!") + return + var/obj/item/reagent_containers/pill/P = locate() in contents + if(P) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, P, user) + if(!user.put_in_hands(P)) + P.forceMove(user.drop_location()) // make sure it's not stuck in the user if the put in hands somehow fails + to_chat(user, "You take \a [P] out of [src].") + else + to_chat(user, "[P] drops to the floor!") else to_chat(user, "There are no pills left in the bottle.") return TRUE From 214b95445e47bcf8ad0ee1d22e64b07605464077 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Thu, 9 Jul 2020 23:59:51 -0700 Subject: [PATCH 009/122] status panel --- code/controllers/subsystem/vote.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index c8a48ef188..390d42dcb4 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -55,14 +55,15 @@ SUBSYSTEM_DEF(vote) /datum/controller/subsystem/vote/proc/render_statpanel(mob/M) if(!mode) // check if vote is running return - if(!statpanel("Vote")) // don't bother if they're not focused on this panel + if(!statpanel("Status")) // don't bother if they're not focused on this panel return var/static/list/supported = list(PLURALITY_VOTING, APPROVAL_VOTING) + stat(null, null) + stat("Vote active!", "There is currently a vote running. Question: [question]") if(!(vote_system in supported)) - stat("Vote Manually!", "The current vote system is not supported by statpanel rendering. Please vote manually by opening the vote popup using the action button or chat link.") + stat("", "The current vote system is not supported by statpanel rendering. Please vote manually by opening the vote popup using the action button or chat link.") return stat("Time Left:", "[round(end_time - world.time)] seconds") - stat("Question:", question) stat(null, null) stat("Choices:", null) stat(null, null) From 630d65dfec72a32419d5f2de593cb7b25b9e60a9 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 10 Jul 2020 00:08:53 -0700 Subject: [PATCH 010/122] done --- code/controllers/subsystem/vote.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 390d42dcb4..a93aff7d2b 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -58,7 +58,6 @@ SUBSYSTEM_DEF(vote) if(!statpanel("Status")) // don't bother if they're not focused on this panel return var/static/list/supported = list(PLURALITY_VOTING, APPROVAL_VOTING) - stat(null, null) stat("Vote active!", "There is currently a vote running. Question: [question]") if(!(vote_system in supported)) stat("", "The current vote system is not supported by statpanel rendering. Please vote manually by opening the vote popup using the action button or chat link.") @@ -76,6 +75,7 @@ SUBSYSTEM_DEF(vote) if(PLURALITY_VOTING) ivotedforthis = voted[usr.ckey] == i stat(ivotedforthis? "\[X\]" : "\[ \]", choice_statclicks[choice]) + stat(null, null) /datum/controller/subsystem/vote/proc/reset() initiator = null From d8aa20b4e99e3ab92eb2c46985a948a6ddefb080 Mon Sep 17 00:00:00 2001 From: TheSpaghetti <37235090+TheSpaghetti@users.noreply.github.com> Date: Sun, 12 Jul 2020 13:11:06 -0400 Subject: [PATCH 011/122] Adds monophobia quirk --- code/datums/traits/negative.dm | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 40b71eec0a..76d2ce9b6b 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -452,3 +452,21 @@ GLOBAL_LIST_EMPTY(family_heirlooms) mob_trait = TRAIT_COLDBLOODED gain_text = "You feel cold-blooded." lose_text = "You feel more warm-blooded." + + /datum/quirk/monophobia + name = "Monophobia" + desc = "You will become increasingly stressed when not in company of others, triggering panic reactions ranging from sickness to heart attacks.." + value = -3 // Might change it to 4. + gain_text = "You feel really lonely..." + lose_text = "You feel like you could be safe on your own." + medical_record_text = "Patient feels sick and distressed when not around other people, leading to potentially lethal levels of stress." + var/datum/brain_trauma/severe/monophobia + +/datum/quirk/monophobia/post_add() + var/mob/living/carbon/human/H = quirk_holder + monophobia = new + H.gain_trauma(monophobia, TRAUMA_RESILIENCE_ABSOLUTE) + +/datum/quirk/monophobia/remove() + var/mob/living/carbon/human/H = quirk_holder + H?.cure_trauma_type(monophobia, TRAUMA_RESILIENCE_ABSOLUTE) From 0200c4ca1f0390c410f7563f5f6c33eff940d65a Mon Sep 17 00:00:00 2001 From: TheSpaghetti <37235090+TheSpaghetti@users.noreply.github.com> Date: Sun, 12 Jul 2020 13:13:25 -0400 Subject: [PATCH 012/122] Fixed the double period. Whoops. --- code/datums/traits/negative.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 76d2ce9b6b..364151f2a1 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -455,7 +455,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms) /datum/quirk/monophobia name = "Monophobia" - desc = "You will become increasingly stressed when not in company of others, triggering panic reactions ranging from sickness to heart attacks.." + desc = "You will become increasingly stressed when not in company of others, triggering panic reactions ranging from sickness to heart attacks." value = -3 // Might change it to 4. gain_text = "You feel really lonely..." lose_text = "You feel like you could be safe on your own." From a3531383d396573109ddeacb88d6add92bb23bda Mon Sep 17 00:00:00 2001 From: TheSpaghetti <37235090+TheSpaghetti@users.noreply.github.com> Date: Sun, 12 Jul 2020 15:29:32 -0400 Subject: [PATCH 013/122] "monophobia = new" isn't needed --- code/datums/traits/negative.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 364151f2a1..da9b36cf25 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -464,7 +464,6 @@ GLOBAL_LIST_EMPTY(family_heirlooms) /datum/quirk/monophobia/post_add() var/mob/living/carbon/human/H = quirk_holder - monophobia = new H.gain_trauma(monophobia, TRAUMA_RESILIENCE_ABSOLUTE) /datum/quirk/monophobia/remove() From cb8725d08db40adda7b1023009b12a683144c352 Mon Sep 17 00:00:00 2001 From: TheSpaghetti <37235090+TheSpaghetti@users.noreply.github.com> Date: Sun, 12 Jul 2020 17:20:08 -0400 Subject: [PATCH 014/122] ok maybe it is --- code/datums/traits/negative.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index da9b36cf25..364151f2a1 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -464,6 +464,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms) /datum/quirk/monophobia/post_add() var/mob/living/carbon/human/H = quirk_holder + monophobia = new H.gain_trauma(monophobia, TRAUMA_RESILIENCE_ABSOLUTE) /datum/quirk/monophobia/remove() From 73d4ea3201ed474c26fff82cebd035899a7168ed Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 13 Jul 2020 16:35:50 -0700 Subject: [PATCH 015/122] Delete emoji_32.dmi --- icons/emoji_32.dmi | Bin 7493 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 icons/emoji_32.dmi diff --git a/icons/emoji_32.dmi b/icons/emoji_32.dmi deleted file mode 100644 index 44b36a35e419c6c64e7edb9409d085afc0340025..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7493 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 P00000NkvXXu0mjfD*J5k From cc3b49666996087ea06ffeb7d0a5571e8e43a0c5 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 13 Jul 2020 16:37:31 -0700 Subject: [PATCH 016/122] Add files via upload --- icons/emoji_32.dmi | Bin 0 -> 7931 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 icons/emoji_32.dmi diff --git a/icons/emoji_32.dmi b/icons/emoji_32.dmi new file mode 100644 index 0000000000000000000000000000000000000000..492ca7404c930496d96dbc13f8f70e495221db7f GIT binary patch literal 7931 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 ud62_p-Ehuc_*KVy!+I` zSdR-jsChST~MFVqtkv!Gc(WG#5_P2&1Q?=r+P<>ak{X5%+J zO&b#FhqTiNcg}*4}D&RDw8yei`Rd0@a7ZmJTm#% zf++6*_Q;2R+ni|(X+b>{$j+XU<3O2sLCpj->W!pQd2XyUG`vb1TeUauo*o<=`j_R4 zA2N47s5o|~J3CK`!t8ZPS4!Lyo|oVM@bbgkkCwK#xBj3!y#E3%OnYl{yxF|8Cd^pQ z5J}sCjaL1Xsq_`ud?9PdBjLYYoZAL~e`4mpDJzYS zsPN%JwVT>C3(D$dnvMZ&qf(g~pQ)S}!Jp}DX=-n6Jkj3TctSQjN}HU~ovEA{sZ^${ z-wac&o=vM&_9Ayg{?R)NYLRRxEyg5_vSOV&`q04bfk(ex8k%^0b7TD=0KBi8w_6i! zD36x^68$#8_Rh{@!}}(dpZQ|yJEJ?Fym9gBZ+46lB!EcRXvkSUlC-k%LIrQ_Pvv=t zQ0{_`oxMkSs<>8^BzXIr<5CQBIlb!9+r?Sr1uFORM z*vku^zZ1_s^RvyZt-n}YeD{BJWgyFCLOfOLr$a)TFQ{#@kxGmvJ6O*{fha#h0{SA} z(W$SE4DT=f@W9A@uK-Z28+P#G#>VD>VHkldv9YmvfR-14T`M^<{;mB0-+Ffa*ejcN z+dsOx^se?vZYo4H>25aa=MqFFL`3|5GAs&5OUvfAC6+HG@42ol7m(hLghPgSAN+0! z*3Q}QYE@1i`R&s1{T~6ybt}iq_gk7@l*f4a{w8y_6EJHya^EWl0A8tV9(lYuf9=0b zWM(mzBT2{#hdTn0B*n>T(-Ik=qmMi?C`GBl(d;X=v_kZ;0BaaN43GxGyShSt;Mm>QG081 z7F1ML&KXg@wPVaPF|aTw|m1bkryUp%ND@|OR-%|yx@BYdGd7S_uLPd1<7dl z!y)YK3|x~*DzKfmzFo%Qt*fDU13{{T9cui3n`h2k}vm$q2el?=f3gv=ZE)?{2YLC&L;reUR@o%(t0PT z8)*Wei?{!k7B^nbQsB#3Lc5*};n=a?`|5q=hi{P2x7+Ol zb8}6tldfH3W~Q=#uvEH3KL6s@uMRCP{`)U|1YWLPOG7Nb5BWZkoPjIMk6(mAuy6S<)YtYrF0#0y3!j0z zdZC%{$X|r|pM~RINtk>-v6b1!N6@*StzYG%btWJ3ad)et*8lx0LtY6u03dfi8q4R6 z3@0P>;^b0-w{}@peu(mY!*}_8%l8SPCyc6Vjn2tXE|7<9DiIM(0_vQFNW0iVXIlr) zlFD9=Arm$t!Z&&dX!8(K(wSA~dMWaq=xzX6IUynI{9c?~N`QKBVno*HBA}}ifK@KX z&^>-UZ={P*gRMq9H1upoVs#^BCsB}UIixPv6Y9SLbVQKoy$Ym1&x&- z5#bJ00^-{@Or2zHrWFydm?S-gLNB_D106jk_VZcGOYKZf@%S662;ZT zi|nNtHlVVbBNWTyvH{3iKAs2Bdb92xR9}c=KuL)FD_yq0styHtQ9fCy)N9_#E$A z5-uXo7yt?;F0$?_0i4#G~mw%a2FX7yM}YdcE%ba*QZH+sj#a@^KWQ{(aw$ l6t5=>1o3(@Kk!Y!{|5=V4t;?2p@ske002ovPDHLkV1i`cQ~Uq` literal 0 HcmV?d00001 From fbf137b7e2993b309fe9361fcc371b6efb79cae2 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 13 Jul 2020 16:39:01 -0700 Subject: [PATCH 017/122] Delete emoji_32.dmi --- icons/emoji_32.dmi | Bin 7931 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 icons/emoji_32.dmi diff --git a/icons/emoji_32.dmi b/icons/emoji_32.dmi deleted file mode 100644 index 492ca7404c930496d96dbc13f8f70e495221db7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7931 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 ud62_p-Ehuc_*KVy!+I` zSdR-jsChST~MFVqtkv!Gc(WG#5_P2&1Q?=r+P<>ak{X5%+J zO&b#FhqTiNcg}*4}D&RDw8yei`Rd0@a7ZmJTm#% zf++6*_Q;2R+ni|(X+b>{$j+XU<3O2sLCpj->W!pQd2XyUG`vb1TeUauo*o<=`j_R4 zA2N47s5o|~J3CK`!t8ZPS4!Lyo|oVM@bbgkkCwK#xBj3!y#E3%OnYl{yxF|8Cd^pQ z5J}sCjaL1Xsq_`ud?9PdBjLYYoZAL~e`4mpDJzYS zsPN%JwVT>C3(D$dnvMZ&qf(g~pQ)S}!Jp}DX=-n6Jkj3TctSQjN}HU~ovEA{sZ^${ z-wac&o=vM&_9Ayg{?R)NYLRRxEyg5_vSOV&`q04bfk(ex8k%^0b7TD=0KBi8w_6i! zD36x^68$#8_Rh{@!}}(dpZQ|yJEJ?Fym9gBZ+46lB!EcRXvkSUlC-k%LIrQ_Pvv=t zQ0{_`oxMkSs<>8^BzXIr<5CQBIlb!9+r?Sr1uFORM z*vku^zZ1_s^RvyZt-n}YeD{BJWgyFCLOfOLr$a)TFQ{#@kxGmvJ6O*{fha#h0{SA} z(W$SE4DT=f@W9A@uK-Z28+P#G#>VD>VHkldv9YmvfR-14T`M^<{;mB0-+Ffa*ejcN z+dsOx^se?vZYo4H>25aa=MqFFL`3|5GAs&5OUvfAC6+HG@42ol7m(hLghPgSAN+0! z*3Q}QYE@1i`R&s1{T~6ybt}iq_gk7@l*f4a{w8y_6EJHya^EWl0A8tV9(lYuf9=0b zWM(mzBT2{#hdTn0B*n>T(-Ik=qmMi?C`GBl(d;X=v_kZ;0BaaN43GxGyShSt;Mm>QG081 z7F1ML&KXg@wPVaPF|aTw|m1bkryUp%ND@|OR-%|yx@BYdGd7S_uLPd1<7dl z!y)YK3|x~*DzKfmzFo%Qt*fDU13{{T9cui3n`h2k}vm$q2el?=f3gv=ZE)?{2YLC&L;reUR@o%(t0PT z8)*Wei?{!k7B^nbQsB#3Lc5*};n=a?`|5q=hi{P2x7+Ol zb8}6tldfH3W~Q=#uvEH3KL6s@uMRCP{`)U|1YWLPOG7Nb5BWZkoPjIMk6(mAuy6S<)YtYrF0#0y3!j0z zdZC%{$X|r|pM~RINtk>-v6b1!N6@*StzYG%btWJ3ad)et*8lx0LtY6u03dfi8q4R6 z3@0P>;^b0-w{}@peu(mY!*}_8%l8SPCyc6Vjn2tXE|7<9DiIM(0_vQFNW0iVXIlr) zlFD9=Arm$t!Z&&dX!8(K(wSA~dMWaq=xzX6IUynI{9c?~N`QKBVno*HBA}}ifK@KX z&^>-UZ={P*gRMq9H1upoVs#^BCsB}UIixPv6Y9SLbVQKoy$Ym1&x&- z5#bJ00^-{@Or2zHrWFydm?S-gLNB_D106jk_VZcGOYKZf@%S662;ZT zi|nNtHlVVbBNWTyvH{3iKAs2Bdb92xR9}c=KuL)FD_yq0styHtQ9fCy)N9_#E$A z5-uXo7yt?;F0$?_0i4#G~mw%a2FX7yM}YdcE%ba*QZH+sj#a@^KWQ{(aw$ l6t5=>1o3(@Kk!Y!{|5=V4t;?2p@ske002ovPDHLkV1i`cQ~Uq` From 08206a02d88cf7748f72470701448a3fda427ad3 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 13 Jul 2020 16:39:30 -0700 Subject: [PATCH 018/122] Add files via upload --- icons/emoji_32.dmi | Bin 0 -> 7940 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 icons/emoji_32.dmi diff --git a/icons/emoji_32.dmi b/icons/emoji_32.dmi new file mode 100644 index 0000000000000000000000000000000000000000..2b52677ff60c32f8fa1d274c3633c33301d4df1c GIT binary patch literal 7940 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 Date: Mon, 13 Jul 2020 16:48:07 -0700 Subject: [PATCH 019/122] epic --- icons/emoji_32.dmi | Bin 7940 -> 7836 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/emoji_32.dmi b/icons/emoji_32.dmi index 2b52677ff60c32f8fa1d274c3633c33301d4df1c..fdd6fc7d75adc7d05ab60ad24383c1b3c56460e5 100644 GIT binary patch delta 7441 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 P00000NkvXXu0mjf!^4;q delta 7546 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 Qg#Z8m07*qoM6N<$f&_E?xc~qF From 4b615b8a6fd2f1ffa883ae6c079fc8c61658ecb2 Mon Sep 17 00:00:00 2001 From: TheSpaghetti <37235090+TheSpaghetti@users.noreply.github.com> Date: Tue, 14 Jul 2020 02:20:27 -0400 Subject: [PATCH 020/122] It should actually work now. Co-authored-by: silicons <2003111+silicons@users.noreply.github.com> --- code/datums/traits/negative.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 364151f2a1..8f902fa088 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -460,13 +460,13 @@ GLOBAL_LIST_EMPTY(family_heirlooms) gain_text = "You feel really lonely..." lose_text = "You feel like you could be safe on your own." medical_record_text = "Patient feels sick and distressed when not around other people, leading to potentially lethal levels of stress." - var/datum/brain_trauma/severe/monophobia /datum/quirk/monophobia/post_add() + . = ..() var/mob/living/carbon/human/H = quirk_holder - monophobia = new - H.gain_trauma(monophobia, TRAUMA_RESILIENCE_ABSOLUTE) + H.gain_trauma(/datum/brain_trauma/severe/monophobia, TRAUMA_RESILIENCE_ABSOLUTE) /datum/quirk/monophobia/remove() + . = ..() var/mob/living/carbon/human/H = quirk_holder - H?.cure_trauma_type(monophobia, TRAUMA_RESILIENCE_ABSOLUTE) + H?.cure_trauma_type(/datum/brain_trauma/severe/monophobia, TRAUMA_RESILIENCE_ABSOLUTE) From a381ed324de6b39389709a0d8a5f923d854dd3a3 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Tue, 14 Jul 2020 09:28:50 -0700 Subject: [PATCH 021/122] Update game_mode.dm --- code/game/gamemodes/game_mode.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index a7ccada9f2..3d7eeb7a8a 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -543,6 +543,8 @@ /datum/game_mode/proc/get_remaining_days(client/C) if(!C) return 0 + if(C.prefs?.db_flags & DB_FLAG_EXEMPT) + return 0 if(!CONFIG_GET(flag/use_age_restriction_for_jobs)) return 0 if(!isnum(C.player_age)) From f653fd5c3cdf5a678efc43dd20f7158b017b257a Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 15 Jul 2020 14:58:51 -0700 Subject: [PATCH 022/122] kay --- code/game/gamemodes/objective.dm | 31 +++++++++++++++++++ .../antagonists/survivalist/survivalist.dm | 12 +++++++ .../antagonists/wizard/equipment/spellbook.dm | 2 ++ 3 files changed, 45 insertions(+) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 6312dc08a4..10b92d9655 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -845,6 +845,37 @@ GLOBAL_LIST_EMPTY(possible_items_special) /datum/objective/destroy/internal var/stolen = FALSE //Have we already eliminated this target? +/datum/objective/steal_five_of_type + name = "steal five of" + explanation_text = "Steal at least five items!" + var/list/wanted_items = list(/obj/item) + +/datum/objective/steal_five_of_type/New() + ..() + wanted_items = typecacheof(wanted_items) + +/datum/objective/steal_five_of_type/summon_guns + name = "steal guns" + explanation_text = "Steal at least five guns!" + wanted_items = list(/obj/item/gun) + +/datum/objective/steal_five_of_type/summon_magic + name = "steal magic" + explanation_text = "Steal at least five magical artefacts!" + wanted_items = list(/obj/item/spellbook, /obj/item/gun/magic, /obj/item/clothing/suit/space/hardsuit/wizard, /obj/item/scrying, /obj/item/antag_spawner/contract, /obj/item/necromantic_stone) + +/datum/objective/steal_five_of_type/check_completion() + var/list/datum/mind/owners = get_owners() + var/stolen_count = 0 + for(var/datum/mind/M in owners) + if(!isliving(M.current)) + continue + var/list/all_items = M.current.GetAllContents() //this should get things in cheesewheels, books, etc. + for(var/obj/I in all_items) //Check for wanted items + if(is_type_in_typecache(I, wanted_items)) + stolen_count++ + return stolen_count >= 5 + //Created by admin tools /datum/objective/custom name = "custom" diff --git a/code/modules/antagonists/survivalist/survivalist.dm b/code/modules/antagonists/survivalist/survivalist.dm index 04ad53f65b..296369fe3b 100644 --- a/code/modules/antagonists/survivalist/survivalist.dm +++ b/code/modules/antagonists/survivalist/survivalist.dm @@ -23,6 +23,18 @@ /datum/antagonist/survivalist/guns greet_message = "Your own safety matters above all else, and the only way to ensure your safety is to stockpile weapons! Grab as many guns as possible, and don't let anyone take them!" +/datum/antagonist/survivalist/guns/forge_objectives() + var/datum/objective/steal_five_of_type/summon_guns/guns = new + guns.owner = owner + objectives += guns + ..() + /datum/antagonist/survivalist/magic name = "Amateur Magician" greet_message = "This magic stuff is... so powerful. You want more. More! They want your power. They can't have it! Don't let them have it!" + +/datum/antagonist/survivalist/magic/forge_objectives() + var/datum/objective/steal_five_of_type/summon_magic/magic = new + magic.owner = owner + objectives += magic + ..() diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index ab043ef1c9..4c29c53a2e 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -503,6 +503,7 @@ name = "Summon Guns" desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long!" dynamic_requirement = 60 + limit = 1 /datum/spellbook_entry/summon/guns/IsAvailible() if(!SSticker.mode) // In case spellbook is placed on map @@ -521,6 +522,7 @@ name = "Summon Magic" desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time." dynamic_requirement = 60 + limit = 1 /datum/spellbook_entry/summon/magic/IsAvailible() if(!SSticker.mode) // In case spellbook is placed on map From a493ecdc4a8dd7dfde5738656216e0a3a56cc7c2 Mon Sep 17 00:00:00 2001 From: CameronWoof Date: Wed, 15 Jul 2020 16:44:24 -0700 Subject: [PATCH 023/122] suture and mesh additions --- code/game/objects/items/stacks/cash.dm | 1 + code/game/objects/items/stacks/medical.dm | 62 ++++++++++++++++++ .../items/stacks/sheets/sheet_types.dm | 4 +- code/game/objects/items/stacks/tape.dm | 1 + code/game/objects/items/stacks/wrap.dm | 1 + code/modules/hydroponics/grown/corn.dm | 1 + code/modules/hydroponics/grown/misc.dm | 31 +++++++++ code/modules/hydroponics/grown/towercap.dm | 2 + code/modules/hydroponics/plant_genes.dm | 4 +- code/modules/paperwork/paper.dm | 1 + .../chemistry/reagents/drink_reagents.dm | 15 +++++ .../chemistry/reagents/other_reagents.dm | 6 ++ .../reagents/chemistry/recipes/medicine.dm | 16 +++++ .../reagents/chemistry/recipes/others.dm | 5 ++ code/modules/vending/megaseed.dm | 3 +- icons/obj/hydroponics/growing_vegetables.dmi | Bin 23222 -> 25949 bytes icons/obj/hydroponics/harvest.dmi | Bin 88306 -> 88669 bytes icons/obj/hydroponics/seeds.dmi | Bin 26415 -> 26558 bytes icons/obj/stack_objects.dmi | Bin 50268 -> 51133 bytes 19 files changed, 148 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm index ce0bc6591a..954950f5e6 100644 --- a/code/game/objects/items/stacks/cash.dm +++ b/code/game/objects/items/stacks/cash.dm @@ -11,6 +11,7 @@ w_class = WEIGHT_CLASS_TINY full_w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE + grind_results = list(/datum/reagent/cellulose = 10) var/value = 0 /obj/item/stack/spacecash/Initialize() diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index e6403e83cc..c238f50abc 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -207,6 +207,16 @@ /obj/item/stack/medical/suture/one amount = 1 +/obj/item/stack/medical/suture/medicated + name = "medicated suture" + icon_state = "suture_purp" + desc = "A suture infused with drugs that speed up wound healing of the treated laceration." + heal_brute = 15 + grind_results = list(/datum/reagent/medicine/polypyr = 2) + +/obj/item/stack/medical/suture/one + amount = 1 + /obj/item/stack/medical/suture/heal(mob/living/M, mob/user) . = ..() if(M.stat == DEAD) @@ -246,12 +256,30 @@ /obj/item/stack/medical/mesh/one amount = 1 +/obj/item/stack/medical/mesh/advanced + name = "advanced regenerative mesh" + desc = "An advanced mesh made with aloe extracts and sterilizing chemicals, used to treat burns." + gender = PLURAL + singular_name = "advanced regenerative mesh" + icon_state = "aloe_mesh" + heal_burn = 15 + grind_results = list(/datum/reagent/consumable/aloejuice = 1) + +/obj/item/stack/medical/mesh/advanced/one + amount = 1 + /obj/item/stack/medical/mesh/Initialize() . = ..() if(amount == max_amount) //only seal full mesh packs is_open = FALSE update_icon() +/obj/item/stack/medical/mesh/advanced/update_icon_state() + if(!is_open) + icon_state = "aloe_mesh_closed" + else + return ..() + /obj/item/stack/medical/mesh/update_icon_state() if(!is_open) icon_state = "regen_mesh_closed" @@ -294,3 +322,37 @@ playsound(src, 'sound/items/poster_ripped.ogg', 20, TRUE) return . = ..() + +/obj/item/stack/medical/aloe + name = "aloe cream" + desc = "A healing paste you can apply on wounds." + + icon_state = "aloe_paste" + self_delay = 20 + other_delay = 10 + novariants = TRUE + amount = 20 + max_amount = 20 + var/heal = 3 + grind_results = list(/datum/reagent/consumable/aloejuice = 1) + +/obj/item/stack/medical/aloe/heal(mob/living/M, mob/user) + . = ..() + if(M.stat == DEAD) + to_chat(user, "[M] is dead! You can not help [M.p_them()].") + return FALSE + if(iscarbon(M)) + return heal_carbon(M, user, heal, heal) + if(isanimal(M)) + var/mob/living/simple_animal/critter = M + if (!(critter.healable)) + to_chat(user, "You cannot use \the [src] on [M]!") + return FALSE + else if (critter.health == critter.maxHealth) + to_chat(user, "[M] is at full health.") + return FALSE + user.visible_message("[user] applies \the [src] on [M].", "You apply \the [src] on [M].") + M.heal_bodypart_damage(heal, heal) + return TRUE + + to_chat(user, "You can't heal [M] with the \the [src]!") \ No newline at end of file diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 3ca7137548..c3a73df05f 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -287,7 +287,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ merge_type = /obj/item/stack/sheet/mineral/wood novariants = TRUE material_type = /datum/material/wood - grind_results = list(/datum/reagent/carbon = 20) + grind_results = list(/datum/reagent/cellulose = 20) walltype = /turf/closed/wall/mineral/wood /obj/item/stack/sheet/mineral/wood/attackby(obj/item/W, mob/user, params) // NOTE: sheet_types.dm is where the WOOD stack lives. Maybe move this over there. @@ -349,7 +349,7 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0) resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/mineral/bamboo - grind_results = list(/datum/reagent/carbon = 5) + grind_results = list(/datum/reagent/cellulose = 10) material_type = /datum/material/bamboo /obj/item/stack/sheet/mineral/bamboo/get_main_recipes() diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm index d33d106d11..b66d053807 100644 --- a/code/game/objects/items/stacks/tape.dm +++ b/code/game/objects/items/stacks/tape.dm @@ -11,6 +11,7 @@ amount = 5 max_amount = 5 resistance_flags = FLAMMABLE + grind_results = list(/datum/reagent/cellulose = 5) var/list/conferred_embed = EMBED_HARMLESS var/overwrite_existing = FALSE diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index 10240e902b..6ae63e640f 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -35,6 +35,7 @@ amount = 25 max_amount = 25 resistance_flags = FLAMMABLE + grind_results = list(/datum/reagent/cellulose = 5) /obj/item/stack/packageWrap/suicide_act(mob/living/user) user.visible_message("[user] begins wrapping [user.p_them()]self in \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index 6c852c426d..ad09751e44 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -38,6 +38,7 @@ throwforce = 0 throw_speed = 3 throw_range = 7 + grind_results = list(/datum/reagent/cellulose = 10) /obj/item/grown/corncob/attackby(obj/item/grown/W, mob/user, params) if(W.get_sharpness()) diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index 01044cda25..fe60e9f397 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -504,3 +504,34 @@ prime() if(!QDELETED(src)) qdel(src) + +/obj/item/seeds/aloe + name = "pack of aloe seeds" + desc = "These seeds grow into aloe." + icon_state = "seed-aloe" + species = "aloe" + plantname = "Aloe" + product = /obj/item/reagent_containers/food/snacks/grown/aloe + lifespan = 60 + endurance = 25 + maturation = 4 + production = 4 + yield = 6 + growthstages = 5 + growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.05, /datum/reagent/consumable/nutriment = 0.05) + +/obj/item/reagent_containers/food/snacks/grown/aloe + seed = /obj/item/seeds/aloe + name = "aloe" + desc = "Cut leaves from the aloe plant." + icon_state = "aloe" + filling_color = "#90EE90" + bitesize_mod = 5 + foodtype = VEGETABLES + juice_results = list(/datum/reagent/consumable/aloejuice = 0) + distill_reagent = /datum/reagent/consumable/ethanol/tequila + +/obj/item/reagent_containers/food/snacks/grown/aloe/microwave_act(obj/machinery/microwave/M) + new /obj/item/stack/medical/aloe(drop_location(), 2) + qdel(src) \ No newline at end of file diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 28ae5f4b69..fe404f5fc0 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -16,6 +16,7 @@ icon_dead = "towercap-dead" genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) mutatelist = list(/obj/item/seeds/tower/steel) + reagents_add = list(/datum/reagent/cellulose = 0.05) /obj/item/seeds/tower/steel name = "pack of steel-cap mycelium" @@ -25,6 +26,7 @@ plantname = "Steel Caps" product = /obj/item/grown/log/steel mutatelist = list() + reagents_add = list(/datum/reagent/cellulose = 0.05, /datum/reagent/iron = 0.05) rarity = 20 /obj/item/grown/log diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index a666a36099..887ea0417c 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -157,12 +157,12 @@ /datum/plant_gene/reagent/polypyr name = "Polypyrylium Oligomers" - reagent_id = "polypyr" + reagent_id = /datum/reagent/medicine/polypyr rate = 0.15 /datum/plant_gene/reagent/liquidelectricity name = "Liquid Electricity" - reagent_id = "liquidelectricity" + reagent_id = /datum/reagent/consumable/liquidelectricity rate = 0.1 // Various traits affecting the product. Each must be somehow useful. diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 4afc2f1d5b..f1c90c24e8 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -21,6 +21,7 @@ resistance_flags = FLAMMABLE max_integrity = 50 dog_fashion = /datum/dog_fashion/head + grind_results = list(/datum/reagent/cellulose = 3) var/info //What's actually written on the paper. var/info_links //A different version of the paper which includes html links at fields and EOF diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index b157f328c5..0c3de579b6 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -999,3 +999,18 @@ glass_name = "glass of bungo juice" glass_desc = "Exotic! You feel like you are on vacation already." value = REAGENT_VALUE_COMMON + +/datum/reagent/consumable/aloejuice + name = "Aloe Juice" + color = "#A3C48B" + description = "A healthy and refreshing juice." + taste_description = "vegetable" + glass_icon_state = "glass_yellow" + glass_name = "glass of aloe juice" + glass_desc = "A healthy and refreshing juice." + +/datum/reagent/consumable/aloejuice/on_mob_life(mob/living/M) + if(M.getToxLoss() && prob(30)) + M.adjustToxLoss(-1, 0) + ..() + . = TRUE \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 988441fa2b..4c66b0e51e 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2296,3 +2296,9 @@ if(data["blood_DNA"]) S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) +/datum/reagent/cellulose + name = "Cellulose Fibers" + description = "A crystaline polydextrose polymer, plants swear by this stuff." + reagent_state = SOLID + color = "#E6E6DA" + taste_mult = 0 \ No newline at end of file diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 9cf9acb424..e591daeb8e 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -318,3 +318,19 @@ id = /datum/reagent/medicine/psicodine results = list(/datum/reagent/medicine/psicodine = 5) required_reagents = list( /datum/reagent/medicine/mannitol = 2, /datum/reagent/water = 2, /datum/reagent/impedrezene = 1) + +/datum/chemical_reaction/medsuture + required_reagents = list(/datum/reagent/cellulose = 10, /datum/reagent/toxin/formaldehyde = 20, /datum/reagent/medicine/polypyr = 15) //This might be a bit much, reagent cost should be reviewed after implementation. + +/datum/chemical_reaction/medsuture/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/stack/medical/suture/medicated(location) + +/datum/chemical_reaction/medmesh + required_reagents = list(/datum/reagent/cellulose = 20, /datum/reagent/consumable/aloejuice = 20, /datum/reagent/space_cleaner/sterilizine = 10) + +/datum/chemical_reaction/medmesh/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/stack/medical/mesh/advanced(location) \ No newline at end of file diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index a8aec91669..63c2bee945 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -825,3 +825,8 @@ required_reagents = list(/datum/reagent/medicine/salglu_solution = 1, /datum/reagent/iron = 1, /datum/reagent/stable_plasma = 1) mix_message = "The mixture congeals and gives off a faint copper scent." required_temp = 350 + +/datum/chemical_reaction/cellulose_carbonization + results = list(/datum/reagent/carbon = 1) + required_reagents = list(/datum/reagent/cellulose = 1) + required_temp = 512 \ No newline at end of file diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm index 2eb68aaf4a..45199298ca 100644 --- a/code/modules/vending/megaseed.dm +++ b/code/modules/vending/megaseed.dm @@ -4,7 +4,8 @@ product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!" product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!" icon_state = "seeds" - products = list(/obj/item/seeds/ambrosia = 3, + products = list(/obj/item/seeds/aloe = 3, + /obj/item/seeds/ambrosia = 3, /obj/item/seeds/apple = 3, /obj/item/seeds/banana = 3, /obj/item/seeds/berry = 3, diff --git a/icons/obj/hydroponics/growing_vegetables.dmi b/icons/obj/hydroponics/growing_vegetables.dmi index b426b8f6de706ff1b3c072fcd5209f9a4358afe1..e174b4fb0b98b605042bb5c72b993488734cb7cb 100644 GIT binary patch literal 25949 zcmb@t2T&Bj_b$4)uz(~9l7mRjQ9#KOM2QNLagm&ZM3E&5NEVfxCFh)RK_tVHGr|%i zgGgAy!Y+6C{r~sXef8?yx>fH{HM2u^PlwarIsKjPGm$!4&q(gl-vxm{B+u29Ux7e4 z=D?*u00B}$5QTmq&>dbsJws1rYY)qJ_HLf`t}Y;uZ${!Q!hu1A3U8%hi$}TE#Xevm zQ?e)5H=#Wwp~56~TaUi-8}a)qL90FdyXSVcza(u&T9Q8hogPhw_DOpA%4)H6kK&D`$WSg2dh7{(PUf+pMG~#k>u#wV2alKrS9b& zt#qDj5qwZ!Xzs(K|F_b(rNv=mxt7TRVFr=F%nOW+u*PXYj0vm`TJ7R1KgJE^?KjIH z;)cKn%`%g5LzV)J&Y9&H#-Eq7xja4p-gCw>*BA?o7Ed34G8WL@E*#g#;!6H;?I25} zZ6~q|n;yi|=bKFypcitK`5ieBgUioMY$QW_+HKX_m6by5d%<>q9Ct4J**RWivGT`2 z#LaPt79MOJH$#3T`tXfPcl0N=frm+shN1hXF=zdhVYna(rXqtsau_-6sRbI#mM z?+IK~WGp>Hlse`=aQ~^6B?m2+6D1Py=>7e!^S*?JH(ULbqI+`Xhu?eY;$M62XngK3 zIrs!AEZiW_1JHA2MLpk){mc*kRMVF?^7x7hiUfrH0>AS&9!e4psyIUI+c`Rng^jOJ z;raq0xDGfCpK!_flB+m!6&*?>cboLt3^}-!&2?JthXg;sRe4Ilu0Zh=m&5$uHFgeW zGdesnJhJan%OG_)%U89O`grtm*vVV|YS?3BU-YHX~ zNPQdTOP6@IKQG3LVk0qpm>|yG?}oq1DaQ|QT-Lnk&b7ks$;pF2yy+5TB|`R{6p`$9 z->SZSO1z_$i9-=!K}!uascM~Vlm$yzarS>yQoL=zU6Vc5fW3;mFX>A!s&c4l^bUil z*q?xW9Ch|DIowit{~n8sTlS&|8AK`lugX7PmE2U3Mml~oJ!J3~&gm_!Ec{_tqu3h_ z(~~g{Uc&dmFMuA|;jJC7(dWavGa~VWRAfPVDylboLu^}D#*lWO05wcMvDDy8(fe_< zAd%&b7hCh;f)by6YvQAx@!eZQQJ?P3j5f&i=(FpIOJVk#sPQm7WE_pT!bb{LD7KdY zAS;N!VxAr^qjXLxXKDLrbo*kiTbqVfiJnx$bS-66)tzrYN!Liw?(^=&Y848m-i%{R zNk^Dg)Vlk7_j{;yEc4cYLf!gzWBEV>W)|@W!FZM#x!o^*C%n@XG`X~p z>`}ofIFrONDc)Jmvp(~t<8Mu7l*QAC*IpKr?IpOhfe4cM};Zc4KheR6wZ=h2} zt1dEMx+R&Pukm%9URzVW31PcW%$J1dD;)Fy1uarIy!85gV!g8YklenLROj9ONnT)tYt4r@faoep?F6h>8NH zxm`++y6P;|3_O7!lohIKx0%|(H#&Xu1n3Qfq*Y*-d`A{%Z9Sk|S8UmrJ@RW!q3PG5 zZC8``9+{VKjwk)RO`cW=jy%7q#U%%E=&sV@XwQhxohXutf6k-ZTm-3hp5!9m2JSlR zOXz&nE8It=)f%u=)2fNtc!lEZhY5W>?KRoy+vv%?1E2JK2`$TAAhCK6h^*Uacah|~ zigDmr5Ux#=21mGCpM>7GDk^v}zAzW3+oD_Dks3t@Tvw1`Z10)gYjo1y)4tO7@j`Xd zHrIZ&fQx%>1KN9Zpen-nKP+4CoxIrY93~G3Y34W?41FPfWVk3L63t<8>Z}nupiq`W zSCI%eIx9@1hotY9DZxbL2PK|!{XJYB7L^`(1s&26I0cgeeL;o;xU=Vg47z06wB&X_ zVWrUREdFyZ5=W|TxE79R@@h+HzrAX^MZ|26W z^yOiMd@aktY?jp0-3;nRUl&y_Rerh52sWP-0l%{CvG~G>pBiH#+m_d9_ z0JzwVV7m#)hiUnSlN@3VLv~7$UN7>umP-xF%HitwgbvSWQ|+2L?rZLPu^2Zo3}`b$ zN8iDnV&YHe^DeEi&VrZrvSL^x6b*`l0GO!e*|vKt;>OYB>Y(!{*;l21{OSx8prPfb zXH8%QpRdgaobJoI<^``-9li_}yLx>>Y}}QdWfimX;wFsQqTI7 zrehJc$gh2~VuM|Ya=Fku2i#!&yHu4_Q-_k3-cOMDW1{N#D9#QFg@mg76*WV~KescFOtXM{61u*CO>nrJ-aFXfj zhW9xtptC1@ICk!yQ7<@E!8#(rLQlu0U#?ER`(DLaQVu_@aOhketMaYy(u0=>w14 z2%5U9i%~$$s_ji`gaaZ75`EpN+gBjp*&fdD!iifM{geRI47bEsA+^s;MjQ2~L$JGp z{uTESk{fBJGc818*P@-3y$l20!9 z%z;AfK>qW(-*&+>siwu~*7xFY> zbKz<*+aKLuF*9Q5=t#UY=wGA2QkA8@@$OIPL1Pb0olO66I+=j=ugdu6G?FY5?}W99 zy8VjKn%~nxmiO8koIBc~gSGOM#*r{L$-Ri_j2EDv+lO+^=_Sugv$20e+s4VtT9#ZN zD;vw-TVsSadHvS0K3s(|+FfujNkz9@3$KqlP8 zXtji>uaRK@XB3o~9<5R0@2Kn2>jaEcJFbIyXRRcoax6IPRS>j+P2?>&?}8~)o8f{M zOZNtdSlL&5W`eke&)Xw+#z}I!Z8SC4sAd}rs^qy;sb4tdqjo}h=?PG*m6BHvqHFZg zS|rN5SIqJE{R!OXBjJm4=AVGxQOMdDbhU()l+ybNQA7eOb8I`6(Zd9_habhwfqx_K zO$2cOOZrnaaFQDP7XsE>2JrvL{Akt5MauE4C*EC+o#MF?J3BZ|_5(y@R)$;iws^<` zJFuKPcWM({nwbkJK)8hkiVdhJ=|KF~bVP3g&wtzj6+11+luNS%q=be@k3!`Z)izYF4AgUqYZhYHOQiD)9pM3Gr-=OX{h=MW@-1dOhUVjcCp@(Q2#7KT zs}+PFsEYjIcKW+0x_^U0vK_}PlOuHpXsy48A*(60yS|=t*y(%XZO{YNmB;A+f`nEgni-M()=ey+#*tW z;sK#y$Q-b888DrvxDGyQiNVHfegGDSd1u0g)@HXu{?tRSUw$jCZ?hOIyka{j=u(CH z%Z}J7h_W8b3VqLx*Fmua8jttbmg@+njJ8$ae7*d#6ScVDIq>#;=@n5ye4js#9j8XP z84aiZQZ+Mez|u|i>MVwgjWS71P&^|=zZT8)EW64%JJZe$t=xMz3`&R8YjT;eOGFGX zmQ7+i5=T$M?S_*$2*&+m7jF$W&ZwE<=ryR`uJO(6rhi^SfDmq~XR*vDeenqb~{vX`-6@){E+Mh$cSJ8CJ%O97!Ny(6lYI3HG-?4YCmLJylZ3^hb3I(f-Uak4P0WhGbUv<6w;kQwRD^g2o#cr}WkG_kA2DR53Nr zOu)jDuEtF*cK6?XqY=2mZj=@^c)tkl%Czc8n1R->QNO9LqBkJ96CmYr7xd3rZgLkM zon>G&yPRw>Hm245o#a=PWKh=ZMJ?1}@`OGoXXTmcc=%f&YkT496~Esb>#w$$FSeD< z1M@Wd$DqTidre>oh|{C!pHggV!(_qiyKynYG#7xF8e)7;0&n7Jk{P3alTM2rGN$$I z2u)nQGT=_!bhRi$X*Dh8o*B#su`+{2#oR@6fUdI{VJIcVSVcFuMjHrT1S0>DgJd?X zt!B@@`T|H`EZv^hW6 zpPbD7$Rpkwz4$`KCxFkL329(L#zw{Rnbex(Vs04w&jq)!C zQtxHDaG54PP(INFTo$jtcf>n}+cz0_?4lOF>T(^geX+bZbe|;g#Ei@xz4#Afa$PVw zd985{+&!HiHdL*K5bMQ0x>=d<mj!?>Z+=y>(~`d|tKnxT_A*gCIC|EK!5is=Vw!j$$07xt}bgSY+8whgsi zvv`S8OIAd8ef;r3fF5evEf-UcWI*U2IfP7dERDgPeaz@AZju$Q8kgK#^BHc_#fpMA zW1qae@REExe!~0VPuwgxfbMf}siblHP5WL&jKr9CR}BtBQ65f~q7>*;Y;*?Ukx>TMFtl?nhXpgrDmDQ0*@_- zds32G(|8{3TXt*DYP=+3+76w%QB5Q=fzWrWY)P%{5m7dYER&c59VWcEJoAo%YN0b|r1 z2p+y=urf1O>fdfPtHvEZPmUTGI-#in=GFJ`2cmW1Utkj>Xr)DG{pre7>fu=J<$Woy zO=;()pKHHp<$MVWmnHFZ57R@GHt;bE;(8BLakjXHYWI8&o1F6iFl*wI;_h!950W>k z+VlpoR*m#v4dB#+6*v&D_AuR3tCqGHLKuv60IU0-!#$G|Y_ ztCINTpNltcbg%rxf0YFq^%(n{EYW`VYNBXIC%<<3$>OqcFk0W)a3HfmgpwcWh{+QK zLryn895)Bpgu1uLy?>8=$eAXT`p$hoB!<>Fs9WFbD*ZmneOJ480T{~mL?c5u8T0o= z!8F&Q%^BC$!wTKO{-@3}Z=?CaDo)7_1+z)j*8N&QmPsr&Qm-+y`YB2SDxu*8<#g=#t=AG; zWR@3`O(Z?9-8(hqdR+1IKjP8luCLj7d zB~4w|iyX#TNsxZyaT=iGsyDxjt#Dc_|BD>F?G%&S+s?HZ0=~KmSIWk=d+RqGzL1wL z`zW=!Q~I0z;xo>Nzhsf9dqu|zW)E#TzY`+I435N*t%E_**;Ny9*~Cr2kON9v@Akz} zMZD$%h5`*7MJ2KP)@j0@D3Is#AbiG9my%5JEaw?fIJig_5r_=@EGPk#3zWP>2RRqB zbj@)Zql%F4z)^$otd%P28JHRf{t&|@>YyI+^`>d0R`Y>inZ~N*IaB-)udasW(~r62_Rki7LTsrd!+JaB^47xPcT2Uh z$5JiKtbQg_`Mj0iJN1yKkI`h8cv`Ow zRwE{ntF_byIc5=p1P0VHZ{b@++04IwEa^8@tr=~XrSwLW#TseEQxm`5(m;#KkWGc7 zS-*-mMykRDuL{>ui8lwQESh(WTM$bhYr*D|gr#`Sw+czr{p_IoOng(!pN&%9ga>g=Qh z13`J268KbDY+zt;!ufDg_=5zs?{N^b5Q2~5P=IA2OvmVe&71^fF&fYR@U8Kf|5MU9 zfH!n8Oog3m|5J>y*T3C0${+D{dh<@1*ljaS#NXfMZdJvqua_}tv_54LP`7E0@`PtU z2%4Gn>o@(1<;j;z;B`3a)HYlS5L%(@K0P2m@)WTD?srLSt=Q`H!9 zOeR^o-Ue-iZRwb-6Zy0X#Us==tF(sRMo;S39(Q>Vc(V)=jpDgj{al-cZaPW^P<#vNbUfNB+NI-(AQq;jtgKj-^5Css=ZZnw*izrN)R8Ll!USsa%l#$>3c+l+ z*B*<{MM{+~T_oh4dAw0y_qLJ6=5lFv5Z~^iQS)n^U{V?xC>gU;yMT%ziNSbfLZsfW zlV?6YEK|IKzVRhpGYU$@k&_TI66@5d)fbCF_omfeSf9_eTfKSXtL1aHYV+W8%(1p^ zmL;fDtNZPUqkUt|Z9^jE4Bk$>W1^e1Gl=n;=YV6tIM$rnN2Eeo&!_nrXUtrWyXe^J zqdupGHP}zkh3GZ3d_C%lZTB;_gQgP2;FR8CL(B#Cvx)L`!UfLy){fXaPy z$|ys+r$Gp}X(4x;rn0oRKp@o-Rud;(Zt#V=2|)Pe3OUAW?~Um{8A-8~$5jPKJ7l(^ ze$2mGf6}U(QqleUBI~N^NpbcOq5W)w{a?7oYN^8{3MJy;Y7GZ@hU%|gP~;4cS61@b z%znc&NS?8)`RQ;cE2a(Tctb$!!AQojb@`g3P}(6zEMTV@;`n>Z9HnyNRVu&LAP%?G z#o5*_$LJr0-WwtUbuQ|G{-xASgG`C{!fz2i<8n;^Amt>ThOq&%-!0ApP5Qf?-HJMa zRiZLeHY;2;-14C*t}fJHR#E^kGz~fMl4TG^haV|vhC4_ObsCluB;SI?S|9qP8&LN5 z&Lq#g>|-m56^qVY&VysB-Cj3%8w<^Rv>&Tzt%uyIHh||JuC4_nT?viY-5g_pQ|@YLpMP zj#Cd2SjZ$w#-ujR%bmf0+y})6H$Ntkm@E>y|3t8E_E`qrc&VjWg%ztsGC4!tcH1`rHFTxwj$>D6`mGCmpn9i8;)X}R&-R0D#FSrTZ-UaD zKe+!q$!IF+ydB)MZ|nv>uP$IX$on(EB;Bbtom$$di5s`h)I@fF9v?FaZJpIxjnbAI>1IjbwQx z8T#%Nr+|opJ1f8>h&btN+z#%!UysKac@eN!prf~0*0C!OZ^wdYHY>BU`oor)$SQ3q<< z(O}zXXkh9jG6~ia(C|jgQr76bu^3Wb^L-qiEYVt7tw5Z170#8edl9F=m!?A^;_DHQ zK}-Fp9Iy9R@J_z-B9k-B7!sS`@WHbu@AvaFBH#EMWg^ffl)3&d@bZO~Q<8Od-kbNP zjz#5^BDnC>iiw%6u%jVKac(4CXh$O^OQ$j#~*;} zy3Mdq-u)uKm#Lj8M^6x)u~jBzaR|?O*Y~TB)iJf#b;W`e<1g-6qyzP&nrRwdBXCO} zN9(r!r<%zdbraF0_1gJt2TnB(P-(|RqjjCUbv>C4bfi}Z#E03PpzlM2#@1;J%mKS2 z^I2}iwNx+8@O<1xhpy|dMf9x@da7NF<-bRo^cW^R;C9qa;xlE+6RmR=63|?ASg$PP z^xR{hyx_8|n_CM+_V(RuTF$bl4jQwV9dX}WZFlUg0ZKc9&*}NB?#H6Y*@#LKOqV5I zNPWv&)j53W2#M~+4R~FZ)Qld}nqy)>DOQCsz}RxLCL*HdKh+sAlqH~ba(P}S;*ZQ_ zjYOx~G}}In8P!pI_ytDQApZd)BIGHg4qAg`Mz(F^(XcF9~n;DOx?IHv<0t1)M|R?YbF${Wd} zF?U^`eF;*S`IkHg7`>Cq@*;{=hrig_QaWA9&eSiL5*QZR=Oywe<)eCZZ zzWo=3buMp4?xgBf>zq+>M~gDJ5%neGpy`VImdwlMZf!QP-a^){_#(H4hE=s80IthV0Go%bQOOf52WtY~8*dkZ0#Z&aECAKQ~ zpyusNrm&-B!Oc#mveVVcdLvBQesV7&{_-!wGmFJ+7N2t0h_5V0gtKHd%6S3obVs_R zH|*{YTAeUoH*OLZzG1UZaGWI3>4DPXIoM4kX@wYugl86S3i=W>C7^@U=~hdCIXhb`99wH2=PW8Lb}T%(Ga zA9QFw7+K%#XvB2?w?{;e0@qwNDgBx#WZm`Q3E;|Uk+P>GW(ycxjZl}FBx&+DabD<{ zgD4oDv+|xcITM$6II}eZi6t!MIN|E@hJy0YpB?ij_dzRr?W39`Nelj&=Z`^B5^p;^ z)^DAUZsyhE-z42p%;uv-y4_UMdO?%? zN~c#Rmh58k9J^4@!sSd~ioFm@!)Yc3{qrPn4p}w0L6Zknxz=Gb>+R>zvpX}Xdy7r> z#po)ls&fJHLu+KOMce(to&l0)(jqyOZc|T$O`WeT0@}k?DL~0MR{^+Vxqlaw^WgWh zuRROSe(%O^l|r!Gek7H<09#569h2q8DinzMK`Lj^_;Z-)o~y%308RSdwXj9hu5@3&-8|@ z!7$p_zLNyEH9N^J#Jhk{6ht3OwxRc?o#Tg*{2C~E-0tZ#&0g~w_S2L6o5L_ij19xE zsaW_|oF^iRN0k#=9i7`laV~Pt_lo7~U`gV{-!#J5APO-)^I?R076NMpIJ4wGXPhf? z(zr!D5VS7sebn|**5EWk;l0g`O5z~mAv;x@4ZHOP zDxL=N*ohPv%f+>{GYeqSER6y<&0kgm~0r(0V$7N{*lbJI2UWzLZ+wy zfNhvAd}*0UR;K1KSfwS7H`2$MBPzD%)qVG)a0g*E&04y1qgSHmn`5YltT{xe|Mh<6pHg` zMoz!vG>N!hLG!c+6;MikM!T z5v2E(O7rOrV72*7Upq6L03N7|ICPgS1tYKTmC3XStWhx!s9jgCq3CFy;j-H>y*S;nQS<(R|wyq4a$w`|hLen}Oaa4o- zLYenrRHr=pOly~5dIiERU%anNB^{q8y}gf4P4{g9?P~{o3uo{1^npBIfY{x7l#yOW zk_#4eiZMmU;Ubd~i+#&YO?OsA?n%xUr^>-f#@thX$gS~z(q~Gy=O7|)BS99CA^pz%cm!AnHdVP`*9#(%@loSrAUtOSmcRjT8k~<_l~e{PD({vSK6RC ztqCfoR$j^PikWwwtmY5@bow)&!Vz&LNzfg9U-V&HjQ(&?k5?{n@3qY__cGw@032WE z{Ys2rUco#B(7mXx*VA^>HAZv0v9~)n(*=(f+`-jTMaSTv&-hvWe~bavs30F3z1x=D zXk`eHDu_bcc5a_gr2+t!4wyLe*CUjORzcpn@GVg6=v*JbKnq5nE>!LhAp6~-zm&NB z-ZRUY+*WAN8^lFI++0`ATBY9R+yzz7PDW(HCDs*U#I|*j`k}T76FyFz|96hd`nBfD z9E{eG{4K`XYg_0h4NK!tOr=j%kWyXUQRe{ot#AY0y;GWy6#FmaUvTb>4aYyAbXu-0 zv6--e7-plX7+&ls^8EAfoW}lzVg09+9rAG6M?|~U*7S@VxhmG3?T^r5|}V&xzl+X0g2kn?B~3b zyZQR9HE;4lMu)|9iOiSj#Yy;Ipm6p?RfW-&qUKz#Ie-cE5*^$t9Bmzg0(y+cD?e2r zw<1kK+JNX$t%h)~Z3g=B-?Z<@jVa{oKIM6g>)iDkF5l$gg7f1g-Ryj-t#9U<&ro5nU`H2ge3MJGJ-*;AN3PWhiv9N=-6ql;#GB)t)lMkGA1YOr% zKYI!f2ZNf<{iOJvLsT#UZiWlEO6fdem(tUi>LVX*!vIibJz@CXtKNUHM@u-MMTY4# z`tn<5r`deleERwa5a^g8Q}U5v4M|XSnp>WU?uD&EJsyZk;)$z6^;BVX0@szeBjta1 zAMLktPVz{+AmE(Abbbtl7}5uX(Icz7I25u zT?0FFO<4@(71GU9y%CQVPWF`SD2Xitu7Z%Q-yQ%Zl+N+6ue>HW4d1liBvjYi+o6qg zzcw#im{|eQ36z^#t$y+m6zWGi>hFxuQlok40Z$`i>*acI{pzC|CM2W1oI3x*>aKV0 z0hRTX3!OPmcYKw2g_IqvMKJz5y!vXL-r{%Twpp(!tdWvEwEW>aFE^NkLtnhSQ2>T{ zEK;ju!B*iau2VxMX4w#RTcz_o8jIU_gD|xzXw+>~01fZ|Nle54HsC=y6NfMHuE9Im zz@YOiJ;iQ(N-Jr!m%)|cAu12b0y_5D zIJ!1_Z`=k%dp!>52&3R@@r|_lZhmDc^P;k=h6bKKLFjYs`L0O!Hr_2a9?b9Jz_mO~ zI)+S~3WlGp3R0|{-+9&Xb{otLW&$D!>0-rD!I3yfM2a&GwLTJ-@m{+FuY?8>{vvm;$kTuSWmzuR|TE52fN!xbLeD#cfI;vdZ4b5eP3a z8dYSgceb$MlOuap&hDopdY?HmMo&|hj;=IS&N&apKG_gm^K^d0zKT>QbtI?(oq6&0 zj{iIvhE6`kf@N7(^MGoK)&MsUOjF01X9I#EWQgg~W;mas{k5!6A`y}q>*o_5V+5y+ z;!lT+@k!LogNnW>Kpd@efc}5S7j4Yx73wnot&jFjtxSjMd-E`s3aN^jo9VA%gm?Z% zQ-MeEKUAY)cWzfq;cG-Xw)NLk=QJy?lFx+;{(&k~oXmIeqhhu;;T!oIty~Y_$=&^0 z*Y{sv;8sK-I;CrG<3hydDzUX0)Td1h1aS3Bsk~xI>F+l@-*WB3UTeOMO;o1wE;{w* zq|uO|kAbHZidrYXVbg(V)>y%*4u^uGSA3*x%&7V5YZx_h_f@YyM;hIS8Mgh(et?>0 zg_|fk7PYYMZfO&~Wa-p$SeY)8V`94bMy51_FE_EHn;mz0vn?{Fb4qufCcJa=QrKDy zb}k<>jD%aZ{LykcElXez9(_-Z_h=a`K&fyWhIB zCcQ1GA9XYE&0xP=uji?BG+0#16L1#Ik)m+IwnmSp!<^%xmm}8~N@E6~xW_CGUT;k> z-P8xdw*4aV7~2Q{2A|gZh!(5zTdPyy6^3pE&-1goU&X%9H(vFf=9l4z!9mrF% zHo_%i~VWPJ1wIGl)4z!*2LiyT@HbWm|=RSztLeRbE9D z4*bFL_6scJ*BmE~kYn>Gm?oJ&FE!=$y6?1lV;zncXgstPljk6_Y zDQ8kM=*t{D6dM}XWPU%aE9Rb#I9!YTS~{pzI&#VrO0C^+vV~iuO`~1Bdtc*qm7DkV zGO@7_aDwz}<@5)T%Amz!AekZeR}Go2xOWQum)gYC%m2E3o!+r!H73^k_l%hrSWR%R zL7ztSlfnCWvoDVP2DDYAbuo`ftxCp*hYdr7+b9r|_t5WxeKJ$L9O@XUvR$gt0jNI@ zPAk;!z1~E%DikGre@Q>v!mFrk7+BO}(}b4pK~=sGW=VDN4!mZ;D-as-BT&gkyO+Cy zt($*NxdQ^C@-`}%oYV2_v6c*XdE_Ix^4ckc&QITPFMTBBp4Jt{p(Sd$`Cx5Nx1$Ei zB@xPwQmo(3&QCz!gD8Tu&lqFm5L7y%2{O)^nDUb6z#f}mZDFfq z0uYP3d_h0+3B!< zh$`JSMmm?@r`-G?r+m5{u4A$D2psgkaxxq9sffk%?9>2p_>Hsc^V?9*FRg65fB%b< z5&eJWWa4*Ld}v-BEx)kYTl(!nFWf>B8MzEF$OJV(EqceML0S-UN%nQh&AoEo-*37% zBVv0NUAaro&zO5r%WYYz(E)4S$|KYwQ%!O?9nnGW0D z2g3>I&JLHB#vf4iRpC-`aWO%0c1lWr0$tWR^wUiN!;9np4rW(Xb+mzNX}lJ9SofF^ zj{d5~j#9VmbY!-Yu<5X>>au+?rF!J@9U5ft<6Lv0po1wANwTvdCcbnayQ{zgvJuDz ztJKWm2MrFs$dn7rw)_=N5`d13d{Y;&Y&qi%JVlzStgHjyo+!3K=K-P zPCOL|u8je)zThDb72A_OkzNb)j! zSdvfdm-dax#^(|_CQ0jVOxE636N^LIAX;{I)b*dHxCv;k`Yo6(uTeUnRkteTC%vX2 zSjmHjk!hJ zOhm{z-oLu;J8oK04ctuG=^q>pDv@h%c$)`zyZ%Pb5HBwxGOi63H#xevs@SuwtnyW- zZliM1=dGq!rkqXS0W*sgC_c^uj)HCd1jSZ~l6{UjkATbFPY|`2+7~8_Ma~Ppx%!;Hz6{Wz_>4 ze$Fh9)*k)m|93)+3Y(l*(uf&9`#>Q|3;LGGG(ID}lJgs=68MDfvAd(?BHBjm|$hHBQeaLVAzm^5o&I3|zGDDO2VdTBa&Z zWk0rg^7qxVtDWeANF5XoG|73&=iT*!Q{=sPq||3y2?DO=d76Kt4zb~yq3#wj7a5Q( zyUV8|Axa2;WlB&6>;mTp4*aWRWSdCPG>6A!$iCHb%Li=%tlM}%zV@qmsD9z`s-=q( zGI-Xw7i(?Jd!zJ1LfW(*dPQ*oJgJZB_ySoE3(cM_!kQ)m&#=!{^yS;^7?uapySd^n z9??eyJYP1&Vt-pLA8g4c2tNtks7UE13;4leUsde1v8E@7PFNInD{i?h27l+yt4)`U zAPx8d9SYIywXGZOyD#Uq-C#G{14ZhF(5~>|faE;J3qR69I=bo0vsqusmo^D~Rg@YZ z%h(3XP1aA|00_FLmW^&vXL2sRwI>yEP`*b5kIc)~i}+{vFTCmmSB6w8AgjuD4=T2D z$nTLDi@Vjtu%69&jD3oJc)~$R-1`xs@n9?hsx02wCFI=|i?d8|L)DgV`Q7nFGty*lJaYbbrkx)WhyfFbo5)w{_4bpPhQ{6tJ4;3H+I3xRa#2N58Ofq- zRmumHUdK3v{N*0!S=@ZmAplH%0i(VE^-Q|v_%8UkLy0=(B6&(4^UEr&GClE}I2)&Z z#u4#L5@3oPlcZQqma+nL;8@b{?ZvPzP12)(19-f_KseMqf-kr?~KxU^8$JWH!<-|Y| zJ&Ptj@|vPJ%4cJqqXZo1OTNeBf26|?KUR7G7cwN{~msESta)j*sJ|pr2xiNzUy1EKB=7` zpKm25daZBJgLnOp@>|%_Ej&E8Kgvost!8~B);FcV7hP6>R6meT)xEyeuia89{(h}Z zfhT5hw-#Yq2@!Xd+5X)Bg#&3`t%}h+`E9OV*S7p=Z&07$u8`@uP<<;eDbXy3NDIY< zJT=jo&ne$0psu`1)_-b8fIb}6+$7AC{m-u~x^EQ#O}lQ>(5r4V;RfAiew$+SeqOf;3IdQAIxqJdP}@9MJD|9?^1Q8nhYcycjL(M|ki<}Hp=JXD zag)UzzclUE zX;hz`1fHh9po^H6m)JUhl4}4`jR2IY_EEA^SnNqh$>4VDjsIA8T< zd{!FffON})TO$R4ak2f{vI4?r$D*G+yz#nE{Uyd3uP}eJ8nBAr&q=`U@XeS!nDDMP ze5YydKSlRc1CKR3RFo#=1B$6`5xEqwOz9(+_)DK3V_1e`D_8k1)1-;jy8S=aKHyr1 zhm=Zh1yJj`-bd2z7zEh;Y>F=b$M@P`rK+Bh3O`t3X=!5)Mv62w@lGZoUET9Kdj-iByFIT4Wr*SYGS zs9VGy0~AnTuK_rI5C6EcXM5csCieCI;^RvZW`}2~jb<5iM73Wp0T9hXN~ySItdSc8 zoJn$Oo`b1!&#lYUHzDE*QGnbSimh}mdbDme5{Ca~uRjP!8)3+=q!(xseEK}NBZ!;y zpEX9D=;2sEx_x%l<52aqN3+9RV{&83oYtSkKc{5n{-e&!zz7YW-mZ^;`4?YtG%w6v zz!Q5@A)|0-Oq3lh5i1ftC_84anjkxv$J&7 zpQOM)?c}_r-#UbVwrPG1$2|K3P&El%R!5C+t-!A1=XMd^+cCbhh{;%NdHv%67;u18 zRs}z%%^zBi2dJr4c`l>;N+2rj=&=C9dcRd{N6IF!JrG;|1_kQaIBNZKI!yxl9z(djeO)`9e0YjzX0FXDq;kRhI>I z*>n(_+x5rS68nFAf?`Fq*2)Qbf|MdTLLMFISQfyi@MS{Z*`zu)TWGpI|0X9G2@a|) zirjK_rv%P?^HAQv*N4Z$x%Vx4S_+VkpcQ5l0op z#pVez0S=BCvqYdaNf@ng(!wVi=a0vh`|0xhL=xis8Q4=s{VKl)#WP_RpUVq1Q+QD8wS!!;|r{dAo{caX(^TP>!s?@(PT^*;7ZmmrOSQP z#Q^sy4Ikj^T!CIhGH7MMJl)gofK!>K4Yrt?V-fkd?(f>Kz-gSHrs+S)@l<8Kh;of?pfN;R|HQNz>PSWV*3KiSCnSaE|wL|z+BCprXJ!Y%0^HS`4ao1 zhtKEEoNa|+n;)D;%G($Z&ohjCb}T{%%=6(>Rb;Tm|3r4E?UKGX@%umiobi9V_5c4v zrc~6NapOl5fk}_DXMS3N`p)bWeBq?b!xc$8Ez@kWMe=156tY0@#;07SUJ=oub8p0| zl5~t^P@jT*`h}Xaa;U7{8^XFqi*z6-frTKF#l&ad+$!n7a`CuA+FQ8OGN)eCKVRbe zPimUv&hm=6LYR}uCHCYY$z1g7vmN#i#2iTr2|Uca|D(0!DN2_jJ%rw?(jfsw5ex#-n^ft&mp~%YOGJ7J5b2%JLJ1|`$@|@V*Kgf**S-JT ztaWnAOwK%e&z?DF_B^vwt{5scDu&=1&h^UW(R>l{RL?AY=nju~h`8u#sg2q(m^_aX zittsLF^`8z^{^>~=XzUz>FD5k0*3bf_s>pg?gcaInwow%r@U!T;bi+qfs$tVC12mt z=>S~JTrj)w+awv=yBsge0FTL}#v%V=L(we+g}R+dU&0Phl5olR8(vut+RwdwyCXqt zbHKjR23w!GMY=Fs_B7D2y!d{nrvnSzqNQx8MolZNeXNQrun+0x1y#wW8JzCk1VuFt zN>#QrIQN@6w7e-vJ{;_QE8)3gjwJphi(pO;1At{VG+Yii+Fk;X8zNxj_5mIq*QUDa zmU5K2Uqq};iL(I*j#GdrKmW9boJ`?aJfSLqugK|zY~yfSDQ!KBO0jf_^$7xVaZnxh z8uX(v_0%aZ=V4}(LufJ6TJ-jew*UMC)#75AJY(>u$1YZ0r^d$MD)tuzPKgX0TrKH@bF%$u{oNC%!AH-#0~d z-_$-PxKua`nEaxNH^^4Q7*cHsMcNeT`gKW^J~!fakp`?sDxSd#WDY3uxo~XU$z}`q zU4w9E1j*6>xY<^zV@*gvBBAA`e~c3}L;0B>*)+3aYB~?IIXs=|LLyy^oiK?+A8Dz& zFRc}32Jfo^R1SmzVaxziC<8B4dUf6OZX(>pP3BPY_Wf`HG@q&KCrkkvE5m}mI1CnX zIk96BSgiW(fgMiX9V8oY@CW}!$Dh#(*J98&)Dx|wkQ-5N7sX~s?63>NO)!x%)S-3{ zF{BfqzCKi)hJu*NryyR<1Fn|V6wbjB>V4cTlbkj`YQBoRw(9?LbAd7b79hi!uCi-iyo&k5jiMK(UU{Z~w$5>tfsd!JkNJR%I;NTatf;cY*ZhfSOoSaXgc#6;Oo{ z)VLm1<7_HemSe~xOeKYBGS^3-R$#*3lPiGfaVN0zaB zS^!H68Dn4)Nq&l#b+qP))K93cJen>3w-Dd}o-XVEL;`E?OT1!*v<%=edZ))+k*t!e z(NhJ#R^!|OC|Ur1Ik?e>-^SY1cG;0$q4VicWG>a8RNwpLGC(^eH3-6#nchc*rTC;D z{dOQBmE?g?Ph1(3NNv{Uy&cAFz%adpfreBow{`sB^eC{JAchjhyHSA-x0jkEcifk_ z>WrW%xS0*VryVXe+hZfBO7!}0n%vcqF88Heif<=L$#Ii${D`DyeflNDc~KG`IVeF$ zrQ#i$A3@{6Yn!kAa>vG}r4vMiF%+5c673fqdz}w#kPZ4jjIc*C=UcHlyG1HMszwYUwg(!3A$Kbf1oV3`-}keY(^d);bR6Fa?qqC z7xF)W*onYj9F*@)%|E*Qsnld|@=55+q z=RHA6mOHtGuE>_2^5(tg%IsH-VO#O}$8AvqqX}rsk}1Y|%o@BJl*UiVqH93NFV^xP z{TlVog$CBJOSbI!bRx-qH0t0~>jBi1RtpltqQ|}YU`&i$!WRBMA>?bNrG1nMSb$|* zLuXl(M>tPRz8fq{@jr` z#*;Du&PC<_@Zu^i-A@A;m8MkxAD))~r+@?h>$VeDRBdLaQ>GpQFRl_{CIkSF-7E5& z!M{D>AR7eg8Xtzv%wU;6#dUO72N)LgXsrNa3)7Tp#i5;OicKXk?OYwVf|NDasW6c&3vC|Eq4wUp|%}&+_d?vtqw+0ay z+fb~c4}hKWva@Z4WzhSiU1JeQ3r}A;O|@4{Q=7eI?3As@f)rm40x|evxl<@dn`j9{ zPGay1>m4zSf7p2aC0#IUaLgL?CT>5VW#AoMBnN1wr7u3+1t1ZSro+G0Q_GxZ_96uI zZL*W$>MCf9`gZvadTXA2z%ij+ffqg7E>B+p?I2Lx`v_da?O-0xGAXk!N#3kvzWvAB z(yr}*;4rNh6va|zMK8^wK*DM(k_ zPML*T>pq$cvA1?f$%aNtT0$lgqAx_-N(9g4UCmk*Mp1@gj^q*vm(przUh*Ga0%E_6 zh`H6Ju8Hajx4p4yv27wJ@YnYq>1pUN9U8A*4YLVpc_|xu7R4izjKf{5ld`n{9w_CF z4*o=SmYsuYgB{IkV~^JKH^{Aks$=Rl*RF{1m=gvQeT$2#O17@5=xt3%=G8*_XQ&6T;o2* zSd}-?nd#vO|osGe9|434-74*(WjM11?6|2Z_qIKjR^wdcI&3N zE4ry9Z|;ZEj1vbfpu*y6b@HSE9ed+{rYHFmSyFz_tsHn^p)@I$|IHgxb1US4S3lwh(@gWs<|hg=M-bDvOW| zved65PE0@EEI+J6ziCK18I7=&)EuFcv({C8ID~H`!Qxko6 zqg!#eZos)GaP$G>T;GY(cm3yVO1bTn$|D7K$l8m^GWTYeKSJ--4`ztRs??}cClMSr z#6s0EQXfS}xnw!zb$K+fr-oFka$C?`_`eQ$;yzPEW&66UQDCQ2PqR~(uX+oS`fw&{ zX{wH?oNJ%7nGiJ1LC-MuOgp1r3r(L-?w;9LHBLZ?Wg+4M#pCx=+?@*aI~lK?101=A zwKl_SA=}@y@A^f}nSE&~W4?fRn9^+hg%0LG;1*>_`4%Od1gsNOKv0J^$5V znZ;cBLsHKrP;z-pv3swr*OnEuFJ*3-pl-O?_dD>K$SV;H0N6;trrI)~h@4!mEm!2S zO|NZd=|&FjvIJmv%E^!7>GEcY6shO#H=Vpb4d^|r78d~$(Dpbs@l@!M)zg1dfvzh9 z$YIjLqt;huC-018A5^ShvTjf%dw)>sX%B6vf>cwDIj2_MwMclXcD5^OF0OCG$Zs9o zc%8@Uo#p+4OT6ihMasH$FMx1r%DxfmETBF*b+^yR!y*jspGR#sgQ=$N}Zrc z9OueP$&B3`P|YdX%l99whf^ma!4!P1q6r+251DRl=M>mh0zk6+olthe#w0z@B_g zrp|to$T}JkUxg_=LbZ0sk!mHJsfy*p$$h)H{N1x(qGh#;tDaM;@;NeJu`~8rOB;S! zt4FTbb~hHZe?_0G!e|t|>M$)BMI6)G=o>hDy--jJJh>A_Tg|&~W--=RrsUZNI}i#@ z>nc;5w_27c{kOZD3)zPbQ%Y^q-`qs1AFdzGBn?W>v1=_>P_E4U?s4vsp<&qiJSk)L z{Y)Do1Dcjtw{y2df@+u_C)eo>eESEQs@ix{p$0sJ5SXCM%)|f!~)q}t(nbhl{8bX z3~u~1(Uo7sEsQ1LsDKgYF~l2_8RyTh?PQan(fc@z4X&m0fZ+^RenZ>Dn zJ>(uQ;<~{h7oM{?=*O{1pUdZQf%)%lDfUI82U(vscbb%BqTge*&jJOJxPp_+L7yP$ z4kRFp&8B)SUup$ymd#Iqw@GsSP=ElgCYZ^Px6(4AlE%2s>Q~_Y#I=3$F69u|g2Yj! z9VGD2fjHFkst-jHu&CU8$X+oZQtX zxeDFMb%kW`(80P~J631~xfi4AW=EOU?f*|1v_bGw10m%aA>0cO* zJt;WhhI~-->``k0YW0m>ed{&KQsdfAN}_2u?i`;(1)53|X!|+iR3YP37dU|U`$6n4 zeweWLZU3+W*c2Cio~Z;4uu=NZ#$QG+`V}*Q_><2(6fXv{VHSsq5veu#X6VlcY7#OL zzc$04c$eJ6+x!|G<=Ndh<#s9$IFr1>dtww6ku1dN7!)AM>>xyu*6{o6@K5*#?bCCk zj!;e(YGrwkMQV%TMBhw*yPm=Iun{@*LF`LZS3v&bUojC#FIPGJF6?&aWP$z3GjQL= zdJEsUtzf_LRy=Uik`@ENFmNXcWg&(f50 z>Fnv>kDl}x1O%)C)&mNFM_-GnbYZHGr#2CZBmY^!rErqqVIm%TBMwYq6`Bo8y(T=Z zigNEnN)6KRI1x{lt|USe@0FIlqwbYLulMT{7U*X?+upE+*U0@9#>QzEihL^|zrq+ved;_BLPeqX`^(r-B_94&QT3)6=KxG z=2};WgH4|_mOPT1ck}j;bA+zzDD$qzo_x$DMj%Uk);SCa1A$qq2gS1{_u>wxKZ&2M z7oUDOKqK|mb+Fw-xoRhkzgljsoaiW@waPO%?!U)g{KZZ8mb9UP#pZzjaXJh|Q~-kS zX|cW?pPX^KXBT(HEyaV{C*`)uDERw&>|i)SBUQpH?HddJgfVI@R*p&JZ{J5HUPSFM z?x<@3%+j{&hOD0^_7%;a&|Kc< zk^*RVX^Hm;*IWB(wog-)j^{ozn^qmsJ&iR2z!t_+1Bg${g4_NH3?$f?0I9bHwzjM19WzA_Dv_@d( zutj+jJ_!bu+GKf^YK2mP;;z97aWg4vcDWUqv-i7DC+YR4lS}Gia{%zh*b)Q&r_m>4 zT!TV1^}ofOZ6znxV*MyZr8$BI^wA%+?#YMaijY3JKwq(gtN;CSD0aiWXV&0FI*W|$ zFDm`L>Wc}96IZZ2jpi#m(0yh%=m?wycK%(?HC^vC6rbQadU7DR*lfo-Q-9J9#}o8h ze8F!+d6--VN)XeR9c)DwVLhWe zj<2D}j%H*eO)1}G<#IKP)I93pF>&iVSlwiWsVhUWnzxSW(DJjj>yWKWoT9FDWl4)+ zEnS`iM?#($#~a6otl%6o^)02_3}A23tO5omhA>qtN%*QceA(vfr|efr@S-QFt5VnT z_l>VQN?-ljcDH)In>|7Zg>av3+gPwd{x-Nr43bQ(UBswfb`LXGZ z1$|C3FFRVXkx+HK*bo!Rg2J;7hdk#O&D^MTgbAD{x-kr8L<4abHOL3{4KZ(&^==J% z9z`sZHy;mEAd6d3Yo7!W8$7el^Y4AebjrX{5c=}w(ofN4wE)_omr|Wu)aNNg z=;WN@?19pg5p3Xj`uO8&1jM#`cO*5m$AG^If8@P4YEr)%FDaGWwUE0YSTE`$m7^{n zCRa(f$MvY@euDg2H~k57Yp9jIF-LNP2y%PNNBp>_KnrT54cXqE(hfrObLWc-y7`XS zb)UmWkJM&(;+4`*KHaVLp{`D^H$D!JgqN(8($CI{_qX%ZM92u=Tz5mk2AmQnC+`GV z`!DkSn8IQT`Kx3-{tC71Df4XLwide}t_HA+LUy){Y0=dM&@(2j)ID(uyYX65oiZUMg^N zgVy?nf9WV$?mflrj$$CuleBEd!x{0Hrw(I0WVcJ*w}0K2f4AP?cZp&Y?XPuE`h^V7 zSB^{wyke{}{^fvg^$d;p5-be~8l@+bBwi@U?Zx6=`~-nsJIMUuSs()ie`dPM2m(1@ zx&#F3PYn(x1O4Q_4@B;-xb`2H-6x=+%q9m{*SgbNpbF{-|9g6H@cS%74>o-e8~y#i z*X(y6;`V}?#BX+;pMrJHWbG& zSi8<#f7P{F<|kl1UHU3ECd%`F@)F#2XSBKV|Gs^O1UW~3p|6na`^4)r2% zaY*gi=V;rAbESdJII>?{r*{bhn5cq3XchHR(#Swdh4y47Xc+8c4_vddALRD7J~{oM z44XW7*Wc-{rwRw14x4HywaTI~E&b_@!pnYXvoTiRhH zU;@BjOr$rq)Q>&r@Ec;l?hq4u1su$_i|~&yFOYk3og*OL&evoE(w)c1Q9A(@>2)4o zS1uePk-oE%7}=5%;C^m=@MWz4bzE;N{dT_q^+i;Q+b@$a)2ZjI+Gfqr(bs{YK#FT10?EA}C|U%Iow zzeJ_QWvsG$K3>+(e9CK}A-GTC3)zL`?S9a~U;wGAfFS`n4QD z#_bXhZC5U}7w!5oyEc`bBIGiu#oE@q^uGexK4+;IYVflzSze5PgK$J0r7DRwtZziQ z==Sbinx6RTz>&={NK2Qe6^JKuEaD3k(bPm5v$JW}Tkpgx0t?0yf^C5NKfck`3)|T_ zD}QoZd-mkXZ6i@ib-m_>r4o;avgXwce`_KYu0E+f(6XV;o_>)wYZZ$T;Gl-@%G-T~ z%V-K-S!a&JxaAS4$wC}Eqm`aK-I}aqtml+`DR2sNH3Iu_OV-D5CGKC`h{hCg@&cX5 zV9TkjVLCW#EF||sd~UIi_G?*8DxeEr29Cb*^;lZ6*M+OJJB>F&((HM@=RAikk9hQD zcxIT&{&22Ot7?)O?5C8D-{NLjCt5Wmgr(olw&9Rc7rbXmJXHQt`5JL}VJ3k7Bl7*} zmEB7fbe`9qq+m;(GX|l&1?Bn3(XPxg7cVG?jl%ONnCuU^|If^n!qw_5GSD+Fax!vI wu*Nf>_cgzBO9%v-xO|xk1d<^8kIO{L@C4d-bu5YAAmF2-q^Vf;!u-R30lzAOfdBvi literal 23222 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 Z%fakWhl|o&Ks{=Z*|nQj@kS4x{|Dv1`fvaM diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index d7800fc0a539c9d2c895f14b1537dbda6011ef3e..7474bb87abd9e4327965819f1d6c90f5169efe9d 100644 GIT binary patch delta 20378 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�V1w8*CO<)vz?94E#AKX(f+V7yo<5HT2QqNE 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ͳH2UKs!vw){A_7ZW<*H7yfj; zLVx2hw{toU=pRm(1|Tckx|j_*>`>XmpAF$2zEQ(rx-Jp2_t$k$!G^Jcl>G zNXHDvu?j>wr624Ffe0vy&Q2!&N{TPz47ga^dfNmm#rD=qd-MD@t`cU_G#^u`+MJ@7 z4$~g$9VHRRO%|NK=v<2!!~UoOX{&0#ihod>!2vKYrIl5-<-F0=5;+ffBUfd9i9@PH zzkgru^rC$U(72@xCJqYOdle>rB;%z7f6p~@xd9Yc=|1U=JtVsM8{Rj6ErF6#4#ddv zaw8yA4gRh}=g6MPxe)AF{lyyUTQ(TajqB!A>}W9g^>g0o$rd_GM$U(un1uct-7GdX z02BjqNsxJE<8xNB=Qg_oTjFV#=rf8kCW2Ns5%hv4^dcqPly9K2!sqv~xY9||jFWS< z>N8rT(3R}wcHtKskHr|Ne#re4QNY{(X>928l;k+gEX{4J%Mv;eD>g$3Kt{Gv)+5nFqKVx9ypM9=^C^b%-Mn~^=p7V~ zrpC@l^W@$LM-6R4{LuLh6KuB>>l9k(*1_X3zwTiwWD_q3jH`S@H*0boeZI;)o%rB_ zRbRj7gOgfr#)0GFHS@R$q<+VHMOfD?(OXlLtvX-OThCSHnx<$R=3hd;U#FS^;f{-) qalTKCReob)#jD-8W^YZdRyrtsvx6(hDJcNNcx=yIuq-?4jrkv$kD`kJ delta 19972 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 delta 10152 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 From 4785a753ba5874f2376ea5e372fca7632bdb147e Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 15 Jul 2020 17:12:48 -0700 Subject: [PATCH 024/122] Update SDQL_2.dm --- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 044016698c..b757028ea2 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -666,8 +666,8 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null obj_count_finished = select_refs var/n = 0 for(var/i in found) - if(++n == 20000) - text_list += "
TRUNCATED - 20000 OBJECT LIMIT HIT" + if(++n == 2500) + text_list += "
TRUNCATED - 2500 OBJECT LIMIT HIT" SDQL_print(i, text_list, print_nulls) select_refs[REF(i)] = TRUE SDQL2_TICK_CHECK From 1e07a277f492217c3b5e6fc3409a8237e1a49708 Mon Sep 17 00:00:00 2001 From: TheSpaghetti <37235090+TheSpaghetti@users.noreply.github.com> Date: Thu, 16 Jul 2020 03:17:28 -0400 Subject: [PATCH 025/122] Makes extradimensional oranges weirder. --- code/modules/hydroponics/grown/citrus.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm index f4748ccde8..6ac7bbcfcb 100644 --- a/code/modules/hydroponics/grown/citrus.dm +++ b/code/modules/hydroponics/grown/citrus.dm @@ -107,8 +107,8 @@ icon_state = "orang" filling_color = "#FFA500" juice_results = list(/datum/reagent/consumable/orangejuice = 0) - distill_reagent = /datum/reagent/consumable/ethanol/triple_sec - tastes = list("polygons" = 1, "oranges" = 1) + distill_reagent = /datum/reagent/toxin/mindbreaker + tastes = list("polygons" = 1, "bluespace" = 1, "the true nature of reality" = 1) /obj/item/reagent_containers/food/snacks/grown/citrus/orange_3d/pickup(mob/user) . = ..() From 9e05d9f748470db8a9b38f28bbbc6fbcd6f50b7d Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Thu, 16 Jul 2020 23:26:46 +0200 Subject: [PATCH 026/122] fixes swarmers not being able to eat any items --- code/modules/antagonists/swarmer/swarmer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index e559313aff..72fb1e89e8 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -486,7 +486,7 @@ var/obj/O = target if(O.resistance_flags & INDESTRUCTIBLE) return FALSE - for(var/mob/living/L in GetAllContents()) + for(var/mob/living/L in target.GetAllContents()) if(!ispAI(L) && !isbrain(L)) to_chat(src, "An organism has been detected inside this object. Aborting.") return FALSE From 584e74590fc2a913b87dbfde4237fe2dbd08bf24 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Fri, 17 Jul 2020 02:01:33 +0100 Subject: [PATCH 027/122] port1 --- code/__DEFINES/DNA.dm | 1 + code/__DEFINES/_flags/obj_flags.dm | 5 + code/__DEFINES/admin.dm | 3 + code/__DEFINES/dcs/signals.dm | 9 +- code/__DEFINES/mobs.dm | 9 +- code/__DEFINES/status_effects.dm | 4 + code/__DEFINES/tools.dm | 1 + code/__DEFINES/traits.dm | 2 +- code/__DEFINES/wounds.dm | 43 +++ code/__HELPERS/_logging.dm | 4 + code/__HELPERS/type2type.dm | 18 +- code/_onclick/other_mobs.dm | 4 + code/controllers/subsystem/persistence.dm | 22 ++ code/datums/armor.dm | 27 +- code/datums/brain_damage/magic.dm | 2 +- code/datums/components/butchering.dm | 9 +- code/datums/components/caltrop.dm | 2 +- code/datums/components/embedded.dm | 10 +- code/datums/components/tackle.dm | 1 + .../diseases/advance/symptoms/flesh_eating.dm | 3 +- code/datums/martial/sleeping_carp.dm | 14 +- code/datums/mind.dm | 4 + .../mood_events/generic_negative_events.dm | 12 +- code/datums/status_effects/buffs.dm | 4 + code/datums/status_effects/debuffs.dm | 11 +- code/datums/status_effects/status_effect.dm | 4 + code/datums/status_effects/wound_effects.dm | 186 +++++++++++ code/datums/traits/neutral.dm | 16 + code/datums/wounds/_scars.dm | 134 ++++++++ code/datums/wounds/cuts.dm | 309 ++++++++++++++++++ code/game/atoms.dm | 31 ++ code/game/machinery/doors/door.dm | 4 + code/game/objects/items/devices/flashlight.dm | 14 +- code/game/objects/items/devices/scanners.dm | 125 +++++-- code/game/objects/items/dualsaber.dm | 2 + code/game/objects/items/fireaxe.dm | 1 + code/game/objects/items/grenades/flashbang.dm | 8 + code/game/objects/items/holy_weapons.dm | 3 + code/game/objects/items/kitchen.dm | 2 + code/game/objects/items/manuals.dm | 4 +- code/game/objects/items/melee/misc.dm | 5 + code/game/objects/items/powerfist.dm | 2 +- code/game/objects/items/shrapnel.dm | 18 +- code/game/objects/items/spear.dm | 2 + code/game/objects/items/stacks/medical.dm | 185 +++++++---- tgstation.dme | 4 + 46 files changed, 1162 insertions(+), 121 deletions(-) create mode 100644 code/__DEFINES/wounds.dm create mode 100644 code/datums/status_effects/wound_effects.dm create mode 100644 code/datums/wounds/_scars.dm create mode 100644 code/datums/wounds/cuts.dm diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index c9e03389f1..f2322fd89b 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -140,6 +140,7 @@ #define CUSTOM_SKINTONE 24 //adds a "_g" suffix to bodypart overlays icon states if a custom skintone is used. #define HORNCOLOR 25 #define WINGCOLOR 26 +#define CAN_SCAR 27 // If this species can be scarred (fleshy) //organ slots #define ORGAN_SLOT_BRAIN "brain" diff --git a/code/__DEFINES/_flags/obj_flags.dm b/code/__DEFINES/_flags/obj_flags.dm index ebb9b4bda0..a936a5cef5 100644 --- a/code/__DEFINES/_flags/obj_flags.dm +++ b/code/__DEFINES/_flags/obj_flags.dm @@ -12,4 +12,9 @@ #define SHOVABLE_ONTO (1<<9) //called on turf.shove_act() to consider whether an object should have a niche effect (defined in their own shove_act()) when someone is pushed onto it, or do a sanity CanPass() check. #define BLOCK_Z_FALL (1<<10) +/// Integrity defines for clothing (not flags but close enough) +#define CLOTHING_PRISTINE 0 // We have no damage on the clothing +#define CLOTHING_DAMAGED 1 // There's some damage on the clothing but it still has at least one functioning bodypart and can be equipped +#define CLOTHING_SHREDDED 2 // The clothing is useless and cannot be equipped unless repaired first + // If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index e8e75c132a..4db9facf19 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -74,6 +74,9 @@ #define ADMIN_PUNISHMENT_MAZING "Puzzle" #define ADMIN_PUNISHMENT_PIE "Cream Pie" #define ADMIN_PUNISHMENT_CUSTOM_PIE "Custom Cream Pie" +#define ADMIN_PUNISHMENT_CRACK ":B:oneless" +#define ADMIN_PUNISHMENT_BLEED ":B:loodless" +#define ADMIN_PUNISHMENT_SCARIFY "Scarify" #define AHELP_ACTIVE 1 #define AHELP_CLOSED 2 diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 5c28694005..7db67c3072 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -250,7 +250,14 @@ #define COMPONENT_INTERRUPT_LIFE_BIOLOGICAL 1 // interrupt biological processes #define COMPONENT_INTERRUPT_LIFE_PHYSICAL 2 // interrupt physical handling -// /mob/living/carbon signals +// /mob/living/carbon physiology signals +#define COMSIG_CARBON_GAIN_WOUND "carbon_gain_wound" //from /datum/wound/proc/apply_wound() (/mob/living/carbon/C, /datum/wound/W, /obj/item/bodypart/L) +#define COMSIG_CARBON_LOSE_WOUND "carbon_lose_wound" //from /datum/wound/proc/remove_wound() (/mob/living/carbon/C, /datum/wound/W, /obj/item/bodypart/L) +///from base of /obj/item/bodypart/proc/attach_limb(): (new_limb, special) allows you to fail limb attachment +#define COMSIG_CARBON_ATTACH_LIMB "carbon_attach_limb" + #define COMPONENT_NO_ATTACH (1<<0) +#define COMSIG_CARBON_REMOVE_LIMB "carbon_remove_limb" //from base of /obj/item/bodypart/proc/drop_limb(special, dismembered) + #define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity)) #define COMSIG_CARBON_IDENTITY_TRANSFERRED_TO "carbon_id_transferred_to" //from datum/dna/transfer_identity(): (datum/dna, transfer_SE) #define COMSIG_CARBON_TACKLED "carbon_tackled" //sends from tackle.dm on tackle completion diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 42139cdeda..b1f7cc84f8 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -57,6 +57,7 @@ #define BODYPART_NOT_DISABLED 0 #define BODYPART_DISABLED_DAMAGE 1 #define BODYPART_DISABLED_PARALYSIS 2 +#define BODYPART_DISABLED_WOUND 3 #define DEFAULT_BODYPART_ICON 'icons/mob/human_parts.dmi' #define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human_parts_greyscale.dmi' @@ -103,12 +104,14 @@ #define TRAUMA_RESILIENCE_BASIC 1 //Curable with chems #define TRAUMA_RESILIENCE_SURGERY 2 //Curable with brain surgery #define TRAUMA_RESILIENCE_LOBOTOMY 3 //Curable with lobotomy -#define TRAUMA_RESILIENCE_MAGIC 4 //Curable only with magic -#define TRAUMA_RESILIENCE_ABSOLUTE 5 //This is here to stay +#define TRAUMA_RESILIENCE_WOUND 4 //Curable by healing the head wound +#define TRAUMA_RESILIENCE_MAGIC 5 //Curable only with magic +#define TRAUMA_RESILIENCE_ABSOLUTE 6 //This is here to stay //Limit of traumas for each resilience tier #define TRAUMA_LIMIT_BASIC 3 #define TRAUMA_LIMIT_SURGERY 2 +#define TRAUMA_LIMIT_WOUND 2 #define TRAUMA_LIMIT_LOBOTOMY 3 #define TRAUMA_LIMIT_MAGIC 3 #define TRAUMA_LIMIT_ABSOLUTE INFINITY @@ -315,4 +318,4 @@ #define EYE_CONTACT_RANGE 5 /// If you examine the same atom twice in this timeframe, we call examine_more() instead of examine() -#define EXAMINE_MORE_TIME 1 SECONDS \ No newline at end of file +#define EXAMINE_MORE_TIME 1 SECONDS diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 4225581018..14cc7c9e5e 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -36,6 +36,8 @@ #define STATUS_EFFECT_REGENERATIVE_CORE /datum/status_effect/regenerative_core //removes damage slowdown while giving a slow regenerating effect +#define STATUS_EFFECT_DETERMINED /datum/status_effect/determined //currently in a combat high from being seriously wounded + ///////////// // DEBUFFS // ///////////// @@ -107,6 +109,8 @@ #define STATUS_EFFECT_ELECTROSTAFF /datum/status_effect/electrostaff //slows down victim +#define STATUS_EFFECT_LIMP /datum/status_effect/limp //For when you have a busted leg (or two!) and want additional slowdown when walking on that leg + ///////////// // NEUTRAL // ///////////// diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm index 7e391caaed..a472e83795 100644 --- a/code/__DEFINES/tools.dm +++ b/code/__DEFINES/tools.dm @@ -17,6 +17,7 @@ //Glasswork Tools #define TOOL_BLOW "blowing_rod" #define TOOL_GLASS_CUT "glasskit" +#define TOOL_BONESET "bonesetter" // If delay between the start and the end of tool operation is less than MIN_TOOL_SOUND_DELAY, // tool sound is only played when op is started. If not, it's played twice. diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index eb86c52301..3e5b27d376 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -228,7 +228,7 @@ #define TRAIT_SPRINT_LOCKED "sprint_locked" //non-mob traits -#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it +#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it #define VEHICLE_TRAIT "vehicle" // inherited from riding vehicles #define INNATE_TRAIT "innate" diff --git a/code/__DEFINES/wounds.dm b/code/__DEFINES/wounds.dm new file mode 100644 index 0000000000..b993429961 --- /dev/null +++ b/code/__DEFINES/wounds.dm @@ -0,0 +1,43 @@ +#define WOUND_DAMAGE_EXPONENT 1.4 + +#define WOUND_SEVERITY_TRIVIAL 0 // for jokey/meme wounds like stubbed toe, no standard messages/sounds or second winds +#define WOUND_SEVERITY_MODERATE 1 +#define WOUND_SEVERITY_SEVERE 2 +#define WOUND_SEVERITY_CRITICAL 3 +#define WOUND_SEVERITY_LOSS 4 // theoretical total limb loss, like dismemberment for cuts + +#define WOUND_BRUTE 0 +#define WOUND_SHARP 1 +#define WOUND_BURN 2 + +// How much determination reagent to add each time someone gains a new wound in [/datum/wound/proc/second_wind()] +#define WOUND_DETERMINATION_MODERATE 1 +#define WOUND_DETERMINATION_SEVERE 2.5 +#define WOUND_DETERMINATION_CRITICAL 5 + +#define WOUND_DETERMINATION_MAX 10 + +// set wound_bonus on an item or attack to this to disable checking wounding for the attack +#define CANT_WOUND -100 + +// list in order of highest severity to lowest +#define WOUND_LIST_BONE list(/datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/moderate) +#define WOUND_LIST_CUT list(/datum/wound/brute/cut/loss, /datum/wound/brute/cut/critical, /datum/wound/brute/cut/severe, /datum/wound/brute/cut/moderate) +#define WOUND_LIST_BURN list(/datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate) + +// Thresholds for infection for burn wounds, once infestation hits each threshold, things get steadily worse +#define WOUND_INFECTION_MODERATE 4 // below this has no ill effects from infection +#define WOUND_INFECTION_SEVERE 8 // then below here, you ooze some pus and suffer minor tox damage, but nothing serious +#define WOUND_INFECTION_CRITICAL 12 // then below here, your limb occasionally locks up from damage and infection and briefly becomes disabled. Things are getting really bad +#define WOUND_INFECTION_SEPTIC 20 // below here, your skin is almost entirely falling off and your limb locks up more frequently. You are within a stone's throw of septic paralysis and losing the limb +// above WOUND_INFECTION_SEPTIC, your limb is completely putrid and you start rolling to lose the entire limb by way of paralyzation. After 3 failed rolls (~4-5% each probably), the limb is paralyzed + +#define WOUND_BURN_SANITIZATION_RATE 0.15 // how quickly sanitization removes infestation and decays per tick +#define WOUND_CUT_MAX_BLOODFLOW 8 // how much blood you can lose per tick per cut max. 8 is a LOT of blood for one cut so don't worry about hitting it easily +#define WOUND_BONE_HEAD_TIME_VARIANCE 20 // if we suffer a bone wound to the head that creates brain traumas, the timer for the trauma cycle is +/- by this percent (0-100) + +// The following are for persistent scar save formats +#define SCAR_SAVE_ZONE 1 // The body_zone we're applying to on granting +#define SCAR_SAVE_DESC 2 // The description we're loading +#define SCAR_SAVE_PRECISE_LOCATION 3 // The precise location we're loading +#define SCAR_SAVE_SEVERITY 4 // The severity the scar had diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 1935dcc8a5..2fead918aa 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -81,6 +81,10 @@ if (CONFIG_GET(flag/log_attack)) WRITE_LOG(GLOB.world_attack_log, "ATTACK: [text]") +/proc/log_wounded(text) + if (CONFIG_GET(flag/log_attack)) + WRITE_LOG(GLOB.world_attack_log, "WOUND: [text]") + /proc/log_manifest(ckey, datum/mind/mind,mob/body, latejoin = FALSE) if (CONFIG_GET(flag/log_manifest)) WRITE_LOG(GLOB.world_manifest_log, "[ckey] \\ [body.real_name] \\ [mind.assigned_role] \\ [mind.special_role ? mind.special_role : "NONE"] \\ [latejoin ? "LATEJOIN":"ROUNDSTART"]") diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 2c8497d5ed..7a18d2ce01 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -339,10 +339,24 @@ /proc/isLeap(y) return ((y) % 4 == 0 && ((y) % 100 != 0 || (y) % 400 == 0)) - +/// For finding out what body parts a body zone covers, the inverse of the below basically +/proc/zone2body_parts_covered(def_zone) + switch(def_zone) + if(BODY_ZONE_CHEST) + return list(CHEST, GROIN) + if(BODY_ZONE_HEAD) + return list(HEAD) + if(BODY_ZONE_L_ARM) + return list(ARM_LEFT, HAND_LEFT) + if(BODY_ZONE_R_ARM) + return list(ARM_RIGHT, HAND_RIGHT) + if(BODY_ZONE_L_LEG) + return list(LEG_LEFT, FOOT_LEFT) + if(BODY_ZONE_R_LEG) + return list(LEG_RIGHT, FOOT_RIGHT) //Turns a Body_parts_covered bitfield into a list of organ/limb names. -//(I challenge you to find a use for this) +//(I challenge you to find a use for this) -I found a use for it!! /proc/body_parts_covered2organ_names(bpc) var/list/covered_parts = list() diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 059f9d518e..87b7f4e866 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -5,6 +5,10 @@ Otherwise pretty standard. */ /mob/living/carbon/human/UnarmedAttack(atom/A, proximity) + var/obj/item/bodypart/check_arm = get_active_hand() + if(check_arm && check_arm.is_disabled() == BODYPART_DISABLED_WOUND) + to_chat(src, "The damage in your [check_arm.name] is preventing you from using it! Get it fixed, or at least splinted!") + return if(!has_active_hand()) //can't attack without a hand. to_chat(src, "You look at your arm and sigh.") diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index cd577e4ac6..b4a162c982 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -268,6 +268,7 @@ SUBSYSTEM_DEF(persistence) SaveRandomizedRecipes() SavePanicBunker() SavePaintings() + SaveScars() /datum/controller/subsystem/persistence/proc/LoadPanicBunker() var/bunker_path = file("data/bunker_passthrough.json") @@ -547,3 +548,24 @@ SUBSYSTEM_DEF(persistence) var/json_file = file("data/paintings.json") fdel(json_file) WRITE_FILE(json_file, json_encode(paintings)) + +/datum/controller/subsystem/persistence/proc/SaveScars() + for(var/i in GLOB.joined_player_list) + var/mob/living/carbon/human/ending_human = get_mob_by_ckey(i) + if(!istype(ending_human) || !ending_human.mind || !ending_human.client || !ending_human.client.prefs || !ending_human.client.prefs.persistent_scars) + continue + + var/mob/living/carbon/human/original_human = ending_human.mind.original_character + if(!original_human || original_human.stat == DEAD || !original_human.all_scars || !(original_human == ending_human)) + if(ending_human.client) // i was told if i don't check this every step of the way byond might decide a client ceases to exist mid proc so here we go + ending_human.client.prefs.scars_list["[ending_human.client.prefs.scars_index]"] = "" + else + for(var/k in ending_human.all_wounds) + var/datum/wound/W = k + W.remove_wound() // so we can get the scars for open wounds + if(!ending_human.client) + return + ending_human.client.prefs.scars_list["[ending_human.client.prefs.scars_index]"] = ending_human.format_scars() + if(!ending_human.client) + return + ending_human.client.prefs.save_character() diff --git a/code/datums/armor.dm b/code/datums/armor.dm index 85915395f8..88170541c6 100644 --- a/code/datums/armor.dm +++ b/code/datums/armor.dm @@ -1,9 +1,9 @@ -#define ARMORID "armor-[melee]-[bullet]-[laser]-[energy]-[bomb]-[bio]-[rad]-[fire]-[acid]-[magic]" +#define ARMORID "armor-[melee]-[bullet]-[laser]-[energy]-[bomb]-[bio]-[rad]-[fire]-[acid]-[magic]-[wound]" -/proc/getArmor(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0) +/proc/getArmor(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0, wound = 0) . = locate(ARMORID) if (!.) - . = new /datum/armor(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic) + . = new /datum/armor(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic, wound) /datum/armor datum_flags = DF_USE_TAG @@ -17,8 +17,9 @@ var/fire var/acid var/magic + var/wound -/datum/armor/New(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0) +/datum/armor/New(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0, wound = 0) src.melee = melee src.bullet = bullet src.laser = laser @@ -29,15 +30,16 @@ src.fire = fire src.acid = acid src.magic = magic + src.wound = wound tag = ARMORID -/datum/armor/proc/modifyRating(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0) - return getArmor(src.melee+melee, src.bullet+bullet, src.laser+laser, src.energy+energy, src.bomb+bomb, src.bio+bio, src.rad+rad, src.fire+fire, src.acid+acid, src.magic+magic) +/datum/armor/proc/modifyRating(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0, wound = 0) + return getArmor(src.melee+melee, src.bullet+bullet, src.laser+laser, src.energy+energy, src.bomb+bomb, src.bio+bio, src.rad+rad, src.fire+fire, src.acid+acid, src.magic+magic, src.wound+wound) /datum/armor/proc/modifyAllRatings(modifier = 0) - return getArmor(melee+modifier, bullet+modifier, laser+modifier, energy+modifier, bomb+modifier, bio+modifier, rad+modifier, fire+modifier, acid+modifier, magic+modifier) + return getArmor(melee+modifier, bullet+modifier, laser+modifier, energy+modifier, bomb+modifier, bio+modifier, rad+modifier, fire+modifier, acid+modifier, magic+modifier, wound+modifier) -/datum/armor/proc/setRating(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic) +/datum/armor/proc/setRating(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic, wound) return getArmor((isnull(melee) ? src.melee : melee),\ (isnull(bullet) ? src.bullet : bullet),\ (isnull(laser) ? src.laser : laser),\ @@ -47,19 +49,20 @@ (isnull(rad) ? src.rad : rad),\ (isnull(fire) ? src.fire : fire),\ (isnull(acid) ? src.acid : acid),\ - (isnull(magic) ? src.magic : magic)) + (isnull(magic) ? src.magic : magic),\ + (isnull(wound) ? src.wound : wound)) /datum/armor/proc/getRating(rating) return vars[rating] /datum/armor/proc/getList() - return list("melee" = melee, "bullet" = bullet, "laser" = laser, "energy" = energy, "bomb" = bomb, "bio" = bio, "rad" = rad, "fire" = fire, "acid" = acid, "magic" = magic) + return list("melee" = melee, "bullet" = bullet, "laser" = laser, "energy" = energy, "bomb" = bomb, "bio" = bio, "rad" = rad, "fire" = fire, "acid" = acid, "magic" = magic, "wound" = wound) /datum/armor/proc/attachArmor(datum/armor/AA) - return getArmor(melee+AA.melee, bullet+AA.bullet, laser+AA.laser, energy+AA.energy, bomb+AA.bomb, bio+AA.bio, rad+AA.rad, fire+AA.fire, acid+AA.acid, magic+AA.magic) + return getArmor(melee+AA.melee, bullet+AA.bullet, laser+AA.laser, energy+AA.energy, bomb+AA.bomb, bio+AA.bio, rad+AA.rad, fire+AA.fire, acid+AA.acid, magic+AA.magic, wound+AA.wound) /datum/armor/proc/detachArmor(datum/armor/AA) - return getArmor(melee-AA.melee, bullet-AA.bullet, laser-AA.laser, energy-AA.energy, bomb-AA.bomb, bio-AA.bio, rad-AA.rad, fire-AA.fire, acid-AA.acid, magic-AA.magic) + return getArmor(melee-AA.melee, bullet-AA.bullet, laser-AA.laser, energy-AA.energy, bomb-AA.bomb, bio-AA.bio, rad-AA.rad, fire-AA.fire, acid-AA.acid, magic-AA.magic, wound-AA.wound) /datum/armor/vv_edit_var(var_name, var_value) if (var_name == NAMEOF(src, tag)) diff --git a/code/datums/brain_damage/magic.dm b/code/datums/brain_damage/magic.dm index ff04ceead9..a00b341b82 100644 --- a/code/datums/brain_damage/magic.dm +++ b/code/datums/brain_damage/magic.dm @@ -94,7 +94,7 @@ if(get_dist(owner, stalker) <= 1) playsound(owner, 'sound/magic/demon_attack1.ogg', 50) owner.visible_message("[owner] is torn apart by invisible claws!", "Ghostly claws tear your body apart!") - owner.take_bodypart_damage(rand(20, 45)) + owner.take_bodypart_damage(rand(20, 45), wound_bonus=CANT_WOUND) else if(prob(50)) stalker.forceMove(get_step_towards(stalker, owner)) if(get_dist(owner, stalker) <= 8) diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm index 441a161428..b5b8849155 100644 --- a/code/datums/components/butchering.dm +++ b/code/datums/components/butchering.dm @@ -2,7 +2,7 @@ var/speed = 80 //time in deciseconds taken to butcher something var/effectiveness = 100 //percentage effectiveness; numbers above 100 yield extra drops var/bonus_modifier = 0 //percentage increase to bonus item chance - var/butcher_sound = 'sound/weapons/slice.ogg' //sound played when butchering + var/butcher_sound = 'sound/effects/butcher.ogg' //sound played when butchering var/butchering_enabled = TRUE var/can_be_blunt = FALSE @@ -64,8 +64,11 @@ H.visible_message("[user] slits [H]'s throat!", \ "[user] slits your throat...") log_combat(user, H, "finishes slicing the throat of") - H.apply_damage(source.force, BRUTE, BODY_ZONE_HEAD) - H.bleed_rate = clamp(H.bleed_rate + 20, 0, 30) + H.apply_damage(source.force, BRUTE, BODY_ZONE_HEAD, wound_bonus=CANT_WOUND) // easy tiger, we'll get to that in a sec + var/obj/item/bodypart/slit_throat = H.get_bodypart(BODY_ZONE_HEAD) + if(slit_throat) + var/datum/wound/brute/cut/critical/screaming_through_a_slit_throat = new + screaming_through_a_slit_throat.apply_wound(slit_throat) H.apply_status_effect(/datum/status_effect/neck_slice) /datum/component/butchering/proc/Butcher(mob/living/butcher, mob/living/meat) diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index 863d55ccab..d138cf1971 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -48,7 +48,7 @@ var/damage = rand(min_damage, max_damage) if(HAS_TRAIT(H, TRAIT_LIGHT_STEP)) damage *= 0.75 - H.apply_damage(damage, BRUTE, picked_def_zone) + H.apply_damage(damage, BRUTE, picked_def_zone, wound_bonus = CANT_WOUND) if(cooldown < world.time - 10) //cooldown to avoid message spam. if(!H.incapacitated(ignore_restraints = TRUE)) diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm index 137a1bb864..ce124646f4 100644 --- a/code/datums/components/embedded.dm +++ b/code/datums/components/embedded.dm @@ -147,7 +147,7 @@ playsound(victim,'sound/weapons/bladeslice.ogg', 40) weapon.add_mob_blood(victim)//it embedded itself in you, of course it's bloody! var/damage = weapon.w_class * impact_pain_mult - limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage) + limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus=-30, sharpness = TRUE) SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded) else victim.visible_message("[weapon] sticks itself to [victim]'s [limb.name]!",ignored_mobs=victim) @@ -163,7 +163,7 @@ if(harmful && prob(chance)) var/damage = weapon.w_class * jostle_pain_mult - limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage) + limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND) to_chat(victim, "[weapon] embedded in your [limb.name] jostles and stings!") @@ -173,7 +173,7 @@ if(harmful) var/damage = weapon.w_class * remove_pain_mult - limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage) + limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND) victim.visible_message("[weapon] falls out of [victim.name]'s [limb.name]!", ignored_mobs=victim) to_chat(victim, "[weapon] falls out of your [limb.name]!") else @@ -199,7 +199,7 @@ if(harmful) var/damage = weapon.w_class * remove_pain_mult - limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage) //It hurts to rip it out, get surgery you dingus. + limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, sharpness=TRUE) //It hurts to rip it out, get surgery you dingus. victim.emote("scream") victim.visible_message("[victim] successfully rips [weapon] out of [victim.p_their()] [limb.name]!", "You successfully remove [weapon] from your [limb.name].") else @@ -276,7 +276,7 @@ damage *= 0.7 if(harmful && prob(chance)) - limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage) + limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, wound_bonus = CANT_WOUND) to_chat(victim, "[weapon] embedded in your [limb.name] hurts!") if(prob(fall_chance)) diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index bd12ecc092..a5f9271f4b 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -62,6 +62,7 @@ ///Store the thrownthing datum for later use /datum/component/tackler/proc/registerTackle(mob/living/carbon/user, datum/thrownthing/TT) tackle = TT + tackle.thrower = user ///See if we can tackle or not. If we can, leap! /datum/component/tackler/proc/checkTackle(mob/living/carbon/user, atom/A, params) diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm index 774d97202e..0fad819e8e 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -64,7 +64,8 @@ Bonus if(bleed) if(ishuman(M)) var/mob/living/carbon/human/H = M - H.bleed_rate += 5 * power + var/obj/item/bodypart/random_part = pick(H.bodyparts) + random_part.generic_bleedstacks += 5 * power return 1 /* diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index a2a9e376e1..7d884344f1 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -44,7 +44,7 @@ else playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1) log_combat(A, D, "strong punched (Sleeping Carp)")//so as to not double up on logging - D.apply_damage((damage + 15) + crit_damage, BRUTE, affecting) + D.apply_damage((damage + 15) + crit_damage, BRUTE, affecting, wound_bonus = CANT_WOUND) return TRUE ///Crashing Wave Kick: Harm Disarm combo, throws people seven tiles backwards @@ -56,7 +56,7 @@ playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) var/atom/throw_target = get_edge_target_turf(D, A.dir) D.throw_at(throw_target, 7, 14, A) - D.apply_damage(damage, BRUTE, BODY_ZONE_CHEST) + D.apply_damage(damage, BRUTE, BODY_ZONE_CHEST, wound_bonus = CANT_WOUND, wound_bonus = CANT_WOUND) log_combat(A, D, "launchkicked (Sleeping Carp)") return TRUE @@ -66,14 +66,14 @@ A.do_attack_animation(D, ATTACK_EFFECT_KICK) playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) if((D.mobility_flags & MOBILITY_STAND)) - D.apply_damage(damage, BRUTE, BODY_ZONE_HEAD) + D.apply_damage(damage, BRUTE, BODY_ZONE_HEAD, wound_bonus = CANT_WOUND) D.DefaultCombatKnockdown(50, override_hardstun = 0.01, override_stamdmg = 0) - D.apply_damage(damage + 35, STAMINA, BODY_ZONE_HEAD) //A cit specific change form the tg port to really punish anyone who tries to stand up + D.apply_damage(damage + 35, STAMINA, BODY_ZONE_HEAD, wound_bonus = CANT_WOUND) //A cit specific change form the tg port to really punish anyone who tries to stand up D.visible_message("[A] kicks [D] in the head, sending them face first into the floor!", \ "You are kicked in the head by [A], sending you crashing to the floor!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A) else - D.apply_damage(damage*0.5, BRUTE, BODY_ZONE_HEAD) - D.apply_damage(damage + 35, STAMINA, BODY_ZONE_HEAD) + D.apply_damage(damage*0.5, BRUTE, BODY_ZONE_HEAD, wound_bonus = CANT_WOUND) + D.apply_damage(damage + 35, STAMINA, BODY_ZONE_HEAD, wound_bonus = CANT_WOUND) D.drop_all_held_items() D.visible_message("[A] kicks [D] in the head!", \ "You are kicked in the head by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A) @@ -99,7 +99,7 @@ D.visible_message("[A] [atk_verb]s [D]!", \ "[A] [atk_verb]s you!", null, null, A) to_chat(A, "You [atk_verb] [D]!") - D.apply_damage(damage, BRUTE, affecting) + D.apply_damage(damage, BRUTE, affecting, wound_bonus = CANT_WOUND) playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1) if(CHECK_MOBILITY(D, MOBILITY_STAND) && damage >= stunthreshold) to_chat(D, "You stumble and fall!") diff --git a/code/datums/mind.dm b/code/datums/mind.dm index d02249fb38..9e426843e4 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -66,6 +66,9 @@ /// Our skill holder. var/datum/skill_holder/skill_holder + ///What character we spawned in as- either at roundstart or latejoin, so we know for persistent scars if we ended as the same person or not + var/mob/original_character + /datum/mind/New(var/key) skill_holder = new(src) src.key = key @@ -90,6 +93,7 @@ return language_holder /datum/mind/proc/transfer_to(mob/new_character, var/force_key_move = 0) + var/original_character = null var/old_character = current var/signals = SEND_SIGNAL(new_character, COMSIG_MOB_PRE_PLAYER_CHANGE, new_character, old_character) | SEND_SIGNAL(src, COMSIG_PRE_MIND_TRANSFER, new_character, old_character) if(signals & COMPONENT_STOP_MIND_TRANSFER) diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index f5692c297a..a2078a82e4 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -77,10 +77,14 @@ description = "Pull it out!\n" mood_change = -7 -/datum/mood_event/table - description = "Someone threw me on a table!\n" - mood_change = -2 - timeout = 2 MINUTES +/datum/mood_event/table_limbsmash + description = "That fucking table, man that hurts...\n" + mood_change = -3 + timeout = 3 MINUTES + +/datum/mood_event/table_limbsmash/add_effects(obj/item/bodypart/banged_limb) + if(banged_limb) + description = "My fucking [banged_limb.name], man that hurts...\n" /datum/mood_event/table/add_effects() if(ishuman(owner)) diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index e080e597a3..179ed765c5 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -441,6 +441,10 @@ owner.adjustBruteLoss(-10, FALSE) owner.adjustFireLoss(-5, FALSE) owner.adjustOxyLoss(-10) + if(!iscarbon(owner)) + return + var/mob/living/carbon/C = owner + QDEL_LIST(C.all_scars) /obj/screen/alert/status_effect/fleshmend name = "Fleshmend" diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index faed65e9c4..561329f02a 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -430,10 +430,19 @@ /datum/status_effect/neck_slice/tick() var/mob/living/carbon/human/H = owner - if(H.stat == DEAD || H.bleed_rate <= 8) + var/obj/item/bodypart/throat = H.get_bodypart(BODY_ZONE_HEAD) + if(H.stat == DEAD || !throat) H.remove_status_effect(/datum/status_effect/neck_slice) if(prob(10)) H.emote(pick("gasp", "gag", "choke")) + var/still_bleeding = FALSE + for(var/thing in throat.wounds) + var/datum/wound/W = thing + if(W.wound_type == WOUND_LIST_CUT && W.severity > WOUND_SEVERITY_MODERATE) + still_bleeding = TRUE + break + if(!still_bleeding) + H.remove_status_effect(/datum/status_effect/neck_slice) /mob/living/proc/apply_necropolis_curse(set_curse, duration = 10 MINUTES) var/datum/status_effect/necropolis_curse/C = has_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE) diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index 12c223f500..dd5fef61d7 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -279,3 +279,7 @@ /datum/status_effect/grouped/before_remove(source) sources -= source return !length(sources) + +//do_after modifier! +/datum/status_effect/proc/interact_speed_modifier() + return 1 diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm new file mode 100644 index 0000000000..751a3508a3 --- /dev/null +++ b/code/datums/status_effects/wound_effects.dm @@ -0,0 +1,186 @@ + +// The shattered remnants of your broken limbs fill you with determination! +/obj/screen/alert/status_effect/determined + name = "Determined" + desc = "The serious wounds you've sustained have put your body into fight-or-flight mode! Now's the time to look for an exit!" + icon_state = "regenerative_core" + +/datum/status_effect/determined + id = "determined" + alert_type = /obj/screen/alert/status_effect/determined + +/datum/status_effect/determined/on_apply() + . = ..() + owner.visible_message("[owner] grits [owner.p_their()] teeth in pain!", "Your senses sharpen as your body tenses up from the wounds you've sustained!", vision_distance=COMBAT_MESSAGE_RANGE) + +/datum/status_effect/determined/on_remove() + owner.visible_message("[owner]'s body slackens noticeably!", "Your adrenaline rush dies off, and the pain from your wounds come aching back in...", vision_distance=COMBAT_MESSAGE_RANGE) + return ..() + +/datum/status_effect/limp + id = "limp" + status_type = STATUS_EFFECT_REPLACE + tick_interval = 10 + alert_type = /obj/screen/alert/status_effect/limp + var/msg_stage = 0//so you dont get the most intense messages immediately + /// The left leg of the limping person + var/obj/item/bodypart/l_leg/left + /// The right leg of the limping person + var/obj/item/bodypart/r_leg/right + /// Which leg we're limping with next + var/obj/item/bodypart/next_leg + /// How many deciseconds we limp for on the left leg + var/slowdown_left = 0 + /// How many deciseconds we limp for on the right leg + var/slowdown_right = 0 + +/datum/status_effect/limp/on_apply() + if(!iscarbon(owner)) + return FALSE + var/mob/living/carbon/C = owner + left = C.get_bodypart(BODY_ZONE_L_LEG) + right = C.get_bodypart(BODY_ZONE_R_LEG) + update_limp() + RegisterSignal(C, COMSIG_MOVABLE_MOVED, .proc/check_step) + RegisterSignal(C, list(COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB), .proc/update_limp) + return TRUE + +/datum/status_effect/limp/on_remove() + UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB)) + +/obj/screen/alert/status_effect/limp + name = "Limping" + desc = "One or more of your legs has been wounded, slowing down steps with that leg! Get it fixed, or at least splinted!" + +/datum/status_effect/limp/proc/check_step(mob/whocares, OldLoc, Dir, forced) + if(!owner.client || !(owner.mobility_flags & MOBILITY_STAND) || !owner.has_gravity() || (owner.movement_type & FLYING) || forced) + return + var/determined_mod = 1 + if(owner.has_status_effect(STATUS_EFFECT_DETERMINED)) + determined_mod = 0.25 + if(next_leg == left) + owner.client.move_delay += slowdown_left * determined_mod + next_leg = right + else + owner.client.move_delay += slowdown_right * determined_mod + next_leg = left + +/datum/status_effect/limp/proc/update_limp() + var/mob/living/carbon/C = owner + left = C.get_bodypart(BODY_ZONE_L_LEG) + right = C.get_bodypart(BODY_ZONE_R_LEG) + + if(!left && !right) + C.remove_status_effect(src) + return + + slowdown_left = 0 + slowdown_right = 0 + + if(left) + for(var/thing in left.wounds) + var/datum/wound/W = thing + slowdown_left += W.limp_slowdown + + if(right) + for(var/thing in right.wounds) + var/datum/wound/W = thing + slowdown_right += W.limp_slowdown + + // this handles losing your leg with the limp and the other one being in good shape as well + if(!slowdown_left && !slowdown_right) + C.remove_status_effect(src) + return + + +///////////////////////// +//////// WOUNDS ///////// +///////////////////////// + +// wound alert +/obj/screen/alert/status_effect/wound + name = "Wounded" + desc = "Your body has sustained serious damage, click here to inspect yourself." + +/obj/screen/alert/status_effect/wound/Click() + var/mob/living/carbon/C = usr + C.check_self_for_injuries() + +// wound status effect base +/datum/status_effect/wound + id = "wound" + status_type = STATUS_EFFECT_MULTIPLE + var/obj/item/bodypart/linked_limb + var/datum/wound/linked_wound + alert_type = NONE + +/datum/status_effect/wound/on_creation(mob/living/new_owner, incoming_wound) + . = ..() + var/datum/wound/W = incoming_wound + linked_wound = W + linked_limb = linked_wound.limb + +/datum/status_effect/wound/on_remove() + linked_wound = null + linked_limb = null + UnregisterSignal(owner, COMSIG_CARBON_LOSE_WOUND) + +/datum/status_effect/wound/on_apply() + if(!iscarbon(owner)) + return FALSE + RegisterSignal(owner, COMSIG_CARBON_LOSE_WOUND, .proc/check_remove) + return TRUE + +/// check if the wound getting removed is the wound we're tied to +/datum/status_effect/wound/proc/check_remove(mob/living/L, datum/wound/W) + if(W == linked_wound) + qdel(src) + + +// bones +/datum/status_effect/wound/bone + +/datum/status_effect/wound/bone/interact_speed_modifier() + var/mob/living/carbon/C = owner + + if(C.get_active_hand() == linked_limb) + to_chat(C, "The [lowertext(linked_wound)] in your [linked_limb.name] slows your progress!") + return linked_wound.interaction_efficiency_penalty + + return 1 + +/datum/status_effect/wound/bone/nextmove_modifier() + var/mob/living/carbon/C = owner + + if(C.get_active_hand() == linked_limb) + return linked_wound.interaction_efficiency_penalty + + return 1 + +/datum/status_effect/wound/bone/moderate + id = "disjoint" +/datum/status_effect/wound/bone/severe + id = "hairline" + +/datum/status_effect/wound/bone/critical + id = "compound" + +// cuts +/datum/status_effect/wound/cut/moderate + id = "abrasion" + +/datum/status_effect/wound/cut/severe + id = "laceration" + +/datum/status_effect/wound/cut/critical + id = "avulsion" + +// burns +/datum/status_effect/wound/burn/moderate + id = "seconddeg" + +/datum/status_effect/wound/burn/severe + id = "thirddeg" + +/datum/status_effect/wound/burn/critical + id = "fourthdeg" diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index 4b039aa1b5..e92564a3b4 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -122,3 +122,19 @@ if(H) var/datum/species/species = H.dna.species species.disliked_food &= ~ALCOHOL + +/datum/quirk/longtimer + name = "Longtimer" + desc = "You've been around for a long time and seen more than your fair share of action, suffering some pretty nasty scars along the way. For whatever reason, you've declined to get them removed or augmented." + value = 0 + gain_text = "Your body has seen better days." + lose_text = "Your sins may wash away, but those scars are here to stay..." + medical_record_text = "Patient has withstood significant physical trauma and declined plastic surgery procedures to heal scarring." + /// the minimum amount of scars we can generate + var/min_scars = 3 + /// the maximum amount of scars we can generate + var/max_scars = 7 + +/datum/quirk/longtimer/on_spawn() + var/mob/living/carbon/C = quirk_holder + C.generate_fake_scars(rand(min_scars, max_scars)) diff --git a/code/datums/wounds/_scars.dm b/code/datums/wounds/_scars.dm new file mode 100644 index 0000000000..bfbaab835e --- /dev/null +++ b/code/datums/wounds/_scars.dm @@ -0,0 +1,134 @@ +/** + * scars are cosmetic datums that are assigned to bodyparts once they recover from wounds. Each wound type and severity have their own descriptions for what the scars + * look like, and then each body part has a list of "specific locations" like your elbow or wrist or wherever the scar can appear, to make it more interesting than "right arm" + * + * + * Arguments: + * * + */ +/datum/scar + var/obj/item/bodypart/limb + var/mob/living/carbon/victim + var/severity + var/description + var/precise_location + + /// Scars from the longtimer quirk are "fake" and won't be saved with persistent scarring, since it makes you spawn with a lot by default + var/fake=FALSE + + /// How many tiles away someone can see this scar, goes up with severity. Clothes covering this limb will decrease visibility by 1 each, except for the head/face which is a binary "is mask obscuring face" check + var/visibility = 2 + /// Whether this scar can actually be covered up by clothing + var/coverable = TRUE + /// What zones this scar can be applied to + var/list/applicable_zones = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_ARM, BODY_ZONE_R_LEG) + +/datum/scar/Destroy(force, ...) + if(limb) + LAZYREMOVE(limb.scars, src) + if(victim) + LAZYREMOVE(victim.all_scars, src) + . = ..() + +/** + * generate() is used to actually fill out the info for a scar, according to the limb and wound it is provided. + * + * After creating a scar, call this on it while targeting the scarred bodypart with a given wound to apply the scar. + * + * Arguments: + * * BP- The bodypart being targeted + * * W- The wound being used to generate the severity and description info + * * add_to_scars- Should always be TRUE unless you're just storing a scar for later usage, like how cuts want to store a scar for the highest severity of cut, rather than the severity when the wound is fully healed (probably demoted to moderate) + */ +/datum/scar/proc/generate(obj/item/bodypart/BP, datum/wound/W, add_to_scars=TRUE) + if(!(BP.body_zone in applicable_zones)) + qdel(src) + return + limb = BP + severity = W.severity + if(limb.owner) + victim = limb.owner + if(add_to_scars) + LAZYADD(limb.scars, src) + if(victim) + LAZYADD(victim.all_scars, src) + + description = pick(W.scarring_descriptions) + precise_location = pick(limb.specific_locations) + switch(W.severity) + if(WOUND_SEVERITY_MODERATE) + visibility = 2 + if(WOUND_SEVERITY_SEVERE) + visibility = 3 + if(WOUND_SEVERITY_CRITICAL) + visibility = 5 + +/// Used when we finalize a scar from a healing cut +/datum/scar/proc/lazy_attach(obj/item/bodypart/BP, datum/wound/W) + LAZYADD(BP.scars, src) + if(BP.owner) + victim = BP.owner + LAZYADD(victim.all_scars, src) + +/// Used to "load" a persistent scar +/datum/scar/proc/load(obj/item/bodypart/BP, description, specific_location, severity=WOUND_SEVERITY_SEVERE) + if(!(BP.body_zone in applicable_zones)) + qdel(src) + return + limb = BP + src.severity = severity + LAZYADD(limb.scars, src) + if(BP.owner) + victim = BP.owner + LAZYADD(victim.all_scars, src) + src.description = description + precise_location = specific_location + switch(severity) + if(WOUND_SEVERITY_MODERATE) + visibility = 2 + if(WOUND_SEVERITY_SEVERE) + visibility = 3 + if(WOUND_SEVERITY_CRITICAL) + visibility = 5 + return TRUE + +/// What will show up in examine_more() if this scar is visible +/datum/scar/proc/get_examine_description(mob/viewer) + if(!victim || !is_visible(viewer)) + return + + var/msg = "[victim.p_they(TRUE)] [victim.p_have()] [description] on [victim.p_their()] [precise_location]." + switch(severity) + if(WOUND_SEVERITY_MODERATE) + msg = "[msg]" + if(WOUND_SEVERITY_SEVERE) + msg = "[msg]" + if(WOUND_SEVERITY_CRITICAL) + msg = "[msg]" + return "\t[msg]" + +/// Whether a scar can currently be seen by the viewer +/datum/scar/proc/is_visible(mob/viewer) + if(!victim || !viewer) + return + if(get_dist(viewer, victim) > visibility) + return + + if(!ishuman(victim) || isobserver(viewer) || victim == viewer) + return TRUE + + var/mob/living/carbon/human/H = victim + if(istype(limb, /obj/item/bodypart/head)) + if((H.wear_mask && (H.wear_mask.flags_inv & HIDEFACE)) || (H.head && (H.head.flags_inv & HIDEFACE))) + return FALSE + else if(limb.scars_covered_by_clothes) + var/num_covers = LAZYLEN(H.clothingonpart(limb)) + if(num_covers + get_dist(viewer, victim) >= visibility) + return FALSE + + return TRUE + +/// Used to format a scar to safe in preferences for persistent scars +/datum/scar/proc/format() + if(!fake) + return "[limb.body_zone]|[description]|[precise_location]|[severity]" diff --git a/code/datums/wounds/cuts.dm b/code/datums/wounds/cuts.dm new file mode 100644 index 0000000000..61a4b8a1ea --- /dev/null +++ b/code/datums/wounds/cuts.dm @@ -0,0 +1,309 @@ + +/* + Cuts +*/ + +/datum/wound/brute/cut + sound_effect = 'sound/weapons/slice.ogg' + processes = TRUE + wound_type = WOUND_LIST_CUT + treatable_by = list(/obj/item/stack/medical/suture, /obj/item/stack/medical/gauze) + treatable_by_grabbed = list(/obj/item/gun/energy/laser) + treatable_tool = TOOL_CAUTERY + treat_priority = TRUE + base_treat_time = 3 SECONDS + + /// How much blood we start losing when this wound is first applied + var/initial_flow + /// When we have less than this amount of flow, either from treatment or clotting, we demote to a lower cut or are healed of the wound + var/minimum_flow + /// How fast our blood flow will naturally decrease per tick, not only do larger cuts bleed more faster, they clot slower + var/clot_rate + + /// Once the blood flow drops below minimum_flow, we demote it to this type of wound. If there's none, we're all better + var/demotes_to + + /// How much staunching per type (cautery, suturing, bandaging) you can have before that type is no longer effective for this cut NOT IMPLEMENTED + var/max_per_type + /// The maximum flow we've had so far + var/highest_flow + /// How much flow we've already cauterized + var/cauterized + /// How much flow we've already sutured + var/sutured + + /// The current bandage we have for this wound (maybe move bandages to the limb?) + var/obj/item/stack/current_bandage + /// A bad system I'm using to track the worst scar we earned (since we can demote, we want the biggest our wound has been, not what it was when it was cured (probably moderate)) + var/datum/scar/highest_scar + +/datum/wound/brute/cut/wound_injury(datum/wound/brute/cut/old_wound = null) + blood_flow = initial_flow + if(old_wound) + blood_flow = max(old_wound.blood_flow, initial_flow) + if(old_wound.severity > severity && old_wound.highest_scar) + highest_scar = old_wound.highest_scar + old_wound.highest_scar = null + if(old_wound.current_bandage) + current_bandage = old_wound.current_bandage + old_wound.current_bandage = null + + if(!highest_scar) + highest_scar = new + highest_scar.generate(limb, src, add_to_scars=FALSE) + +/datum/wound/brute/cut/remove_wound(ignore_limb, replaced) + if(!replaced && highest_scar) + already_scarred = TRUE + highest_scar.lazy_attach(limb) + return ..() + +/datum/wound/brute/cut/get_examine_description(mob/user) + if(!current_bandage) + return ..() + + var/bandage_condition = "" + // how much life we have left in these bandages + switch(current_bandage.absorption_capacity) + if(0 to 1.25) + bandage_condition = "nearly ruined " + if(1.25 to 2.75) + bandage_condition = "badly worn " + if(2.75 to 4) + bandage_condition = "slightly bloodied " + if(4 to INFINITY) + bandage_condition = "clean " + return "The cuts on [victim.p_their()] [limb.name] are wrapped with [bandage_condition] [current_bandage.name]!" + +/datum/wound/brute/cut/receive_damage(wounding_type, wounding_dmg, wound_bonus) + if(victim.stat != DEAD && wounding_type == WOUND_SHARP) // can't stab dead bodies to make it bleed faster this way + blood_flow += 0.05 * wounding_dmg + +/datum/wound/brute/cut/handle_process() + blood_flow = min(blood_flow, WOUND_CUT_MAX_BLOODFLOW) + + if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/toxin/heparin)) + blood_flow += 0.5 // old herapin used to just add +2 bleed stacks per tick, this adds 0.5 bleed flow to all open cuts which is probably even stronger as long as you can cut them first + else if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/medicine/coagulant)) + blood_flow -= 0.25 + + if(current_bandage) + if(clot_rate > 0) + blood_flow -= clot_rate + blood_flow -= current_bandage.absorption_rate + current_bandage.absorption_capacity -= current_bandage.absorption_rate + if(current_bandage.absorption_capacity < 0) + victim.visible_message("Blood soaks through \the [current_bandage] on [victim]'s [limb.name].", "Blood soaks through \the [current_bandage] on your [limb.name].", vision_distance=COMBAT_MESSAGE_RANGE) + QDEL_NULL(current_bandage) + treat_priority = TRUE + else + blood_flow -= clot_rate + + if(blood_flow > highest_flow) + highest_flow = blood_flow + + if(blood_flow < minimum_flow) + if(demotes_to) + replace_wound(demotes_to) + else + to_chat(victim, "The cut on your [limb.name] has stopped bleeding!") + qdel(src) + +/* BEWARE, THE BELOW NONSENSE IS MADNESS. bones.dm looks more like what I have in mind and is sufficiently clean, don't pay attention to this messiness */ + +/datum/wound/brute/cut/check_grab_treatments(obj/item/I, mob/user) + if(istype(I, /obj/item/gun/energy/laser)) + return TRUE + +/datum/wound/brute/cut/treat(obj/item/I, mob/user) + if(istype(I, /obj/item/gun/energy/laser)) + las_cauterize(I, user) + else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature() > 300) + tool_cauterize(I, user) + else if(istype(I, /obj/item/stack/medical/gauze)) + bandage(I, user) + else if(istype(I, /obj/item/stack/medical/suture)) + suture(I, user) + +/datum/wound/brute/cut/try_handling(mob/living/carbon/human/user) + if(user.pulling != victim || user.zone_selected != limb.body_zone || user.a_intent == INTENT_GRAB) + return FALSE + + if(!isfelinid(user)) + return FALSE + + lick_wounds(user) + return TRUE + +/// if a felinid is licking this cut to reduce bleeding +/datum/wound/brute/cut/proc/lick_wounds(mob/living/carbon/human/user) + if(INTERACTING_WITH(user, victim)) + to_chat(user, "You're already interacting with [victim]!") + return + + user.visible_message("[user] begins licking the wounds on [victim]'s [limb.name].", "You begin licking the wounds on [victim]'s [limb.name]...", ignored_mobs=victim) + to_chat(victim, "[user] begins to lick the wounds on your [limb.name].[user] licks the wounds on [victim]'s [limb.name].", "You lick some of the wounds on [victim]'s [limb.name]", ignored_mobs=victim) + to_chat(victim, "[user] licks the wounds on your [limb.name]! minimum_flow) + try_handling(user) + else if(demotes_to) + to_chat(user, "You successfully lower the severity of [victim]'s cuts.") + +/datum/wound/brute/cut/on_xadone(power) + . = ..() + blood_flow -= 0.03 * power // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort + +/// If someone's putting a laser gun up to our cut to cauterize it +/datum/wound/brute/cut/proc/las_cauterize(obj/item/gun/energy/laser/lasgun, mob/user) + var/self_penalty_mult = (user == victim ? 1.25 : 1) + user.visible_message("[user] begins aiming [lasgun] directly at [victim]'s [limb.name]...", "You begin aiming [lasgun] directly at [user == victim ? "your" : "[victim]'s"] [limb.name]...") + if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) + return + var/damage = lasgun.chambered.BB.damage + lasgun.chambered.BB.wound_bonus -= 30 + lasgun.chambered.BB.damage *= self_penalty_mult + if(!lasgun.process_fire(victim, victim, TRUE, null, limb.body_zone)) + return + victim.emote("scream") + blood_flow -= damage / (5 * self_penalty_mult) // 20 / 5 = 4 bloodflow removed, p good + cauterized += damage / (5 * self_penalty_mult) + victim.visible_message("The cuts on [victim]'s [limb.name] scar over!") + +/// If someone is using either a cautery tool or something with heat to cauterize this cut +/datum/wound/brute/cut/proc/tool_cauterize(obj/item/I, mob/user) + var/self_penalty_mult = (user == victim ? 1.5 : 1) + user.visible_message("[user] begins cauterizing [victim]'s [limb.name] with [I]...", "You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") + var/time_mod = user.mind?.get_skill_modifier(/datum/skill/healing, SKILL_SPEED_MODIFIER) || 1 + if(!do_after(user, base_treat_time * time_mod * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) + return + + user.visible_message("[user] cauterizes some of the bleeding on [victim].", "You cauterize some of the bleeding on [victim].") + limb.receive_damage(burn = 2 + severity, wound_bonus = CANT_WOUND) + if(prob(30)) + victim.emote("scream") + var/blood_cauterized = (0.6 / self_penalty_mult) + blood_flow -= blood_cauterized + cauterized += blood_cauterized + + if(blood_flow > minimum_flow) + try_treating(I, user) + else if(demotes_to) + to_chat(user, "You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.") + +/// If someone is using a suture to close this cut +/datum/wound/brute/cut/proc/suture(obj/item/stack/medical/suture/I, mob/user) + var/self_penalty_mult = (user == victim ? 1.4 : 1) + user.visible_message("[user] begins stitching [victim]'s [limb.name] with [I]...", "You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") + var/time_mod = user.mind?.get_skill_modifier(/datum/skill/healing, SKILL_SPEED_MODIFIER) || 1 + if(!do_after(user, base_treat_time * time_mod * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) + return + user.visible_message("[user] stitches up some of the bleeding on [victim].", "You stitch up some of the bleeding on [user == victim ? "yourself" : "[victim]"].") + var/blood_sutured = I.stop_bleeding / self_penalty_mult + blood_flow -= blood_sutured + sutured += blood_sutured + limb.heal_damage(I.heal_brute, I.heal_burn) + + if(blood_flow > minimum_flow) + try_treating(I, user) + else if(demotes_to) + to_chat(user, "You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.") + +/// If someone is using gauze on this cut +/datum/wound/brute/cut/proc/bandage(obj/item/stack/I, mob/user) + if(current_bandage) + if(current_bandage.absorption_capacity > I.absorption_capacity + 1) + to_chat(user, "The [current_bandage] on [victim]'s [limb.name] is still in better condition than your [I.name]!") + return + else + user.visible_message("[user] begins rewrapping the cuts on [victim]'s [limb.name] with [I]...", "You begin rewrapping the cuts on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") + else + user.visible_message("[user] begins wrapping the cuts on [victim]'s [limb.name] with [I]...", "You begin wrapping the cuts on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") + var/time_mod = user.mind?.get_skill_modifier(/datum/skill/healing, SKILL_SPEED_MODIFIER) || 1 + if(!do_after(user, base_treat_time * time_mod, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) + return + + user.visible_message("[user] applies [I] to [victim]'s [limb.name].", "You bandage some of the bleeding on [user == victim ? "yourself" : "[victim]"].") + QDEL_NULL(current_bandage) + current_bandage = new I.type(limb) + current_bandage.amount = 1 + treat_priority = FALSE + I.use(1) + + +/datum/wound/brute/cut/moderate + name = "Rough Abrasion" + desc = "Patient's skin has been badly scraped, generating moderate blood loss." + treat_text = "Application of clean bandages or first-aid grade sutures, followed by food and rest." + examine_desc = "has an open cut" + occur_text = "is cut open, slowly leaking blood" + sound_effect = 'sound/effects/blood1.ogg' + severity = WOUND_SEVERITY_MODERATE + initial_flow = 2 + minimum_flow = 0.5 + max_per_type = 3 + clot_rate = 0.15 + threshold_minimum = 20 + threshold_penalty = 10 + status_effect_type = /datum/status_effect/wound/cut/moderate + scarring_descriptions = list("light, faded lines", "minor cut marks", "a small faded slit", "a series of small scars") + +/datum/wound/brute/cut/severe + name = "Open Laceration" + desc = "Patient's skin is ripped clean open, allowing significant blood loss." + treat_text = "Speedy application of first-aid grade sutures and clean bandages, followed by vitals monitoring to ensure recovery." + examine_desc = "has a severe cut" + occur_text = "is ripped open, veins spurting blood" + sound_effect = 'sound/effects/blood2.ogg' + severity = WOUND_SEVERITY_SEVERE + initial_flow = 3.25 + minimum_flow = 2.75 + clot_rate = 0.07 + max_per_type = 4 + threshold_minimum = 50 + threshold_penalty = 25 + demotes_to = /datum/wound/brute/cut/moderate + status_effect_type = /datum/status_effect/wound/cut/severe + scarring_descriptions = list("a twisted line of faded gashes", "a gnarled sickle-shaped slice scar", "a long-faded puncture wound") + +/datum/wound/brute/cut/critical + name = "Weeping Avulsion" + desc = "Patient's skin is completely torn open, along with significant loss of tissue. Extreme blood loss will lead to quick death without intervention." + treat_text = "Immediate bandaging and either suturing or cauterization, followed by supervised resanguination." + examine_desc = "is spurting blood at an alarming rate" + occur_text = "is torn open, spraying blood wildly" + sound_effect = 'sound/effects/blood3.ogg' + severity = WOUND_SEVERITY_CRITICAL + initial_flow = 4.25 + minimum_flow = 4 + clot_rate = -0.05 // critical cuts actively get worse instead of better + max_per_type = 5 + threshold_minimum = 80 + threshold_penalty = 40 + demotes_to = /datum/wound/brute/cut/severe + status_effect_type = /datum/status_effect/wound/cut/critical + scarring_descriptions = list("a winding path of very badly healed scar tissue", "a series of peaks and valleys along a gruesome line of cut scar tissue", "a grotesque snake of indentations and stitching scars") + +// TODO: see about moving dismemberment over to this, i'll have to add judging dismembering power/wound potential wrt item size i guess +/datum/wound/brute/cut/loss + name = "Dismembered" + desc = "oof ouch!!" + occur_text = "is violently dismembered!" + sound_effect = 'sound/effects/dismember.ogg' + viable_zones = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + severity = WOUND_SEVERITY_LOSS + threshold_minimum = 180 + status_effect_type = null + +/datum/wound/brute/cut/loss/apply_wound(obj/item/bodypart/L, silent, datum/wound/brute/cut/old_wound, smited = FALSE) + if(!L.dismemberable) + qdel(src) + return + + L.dismember() + qdel(src) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 5d29ef1598..fd922729ab 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -982,6 +982,37 @@ Proc for attack log creation, because really why not var/reverse_message = "has been [what_done] by [ssource][postfix]" target.log_message(reverse_message, LOG_ATTACK, color="orange", log_globally=FALSE) +/** + * log_wound() is for when someone is *attacked* and suffers a wound. Note that this only captures wounds from damage, so smites/forced wounds aren't logged, as well as demotions like cuts scabbing over + * + * Note that this has no info on the attack that dealt the wound: information about where damage came from isn't passed to the bodypart's damaged proc. When in doubt, check the attack log for attacks at that same time + * TODO later: Add logging for healed wounds, though that will require some rewriting of healing code to prevent admin heals from spamming the logs. Not high priority + * + * Arguments: + * * victim- The guy who got wounded + * * suffered_wound- The wound, already applied, that we're logging. It has to already be attached so we can get the limb from it + * * dealt_damage- How much damage is associated with the attack that dealt with this wound. + * * dealt_wound_bonus- The wound_bonus, if one was specified, of the wounding attack + * * dealt_bare_wound_bonus- The bare_wound_bonus, if one was specified *and applied*, of the wounding attack. Not shown if armor was present + * * base_roll- Base wounding ability of an attack is a random number from 1 to (dealt_damage ** WOUND_DAMAGE_EXPONENT). This is the number that was rolled in there, before mods + */ +/proc/log_wound(atom/victim, datum/wound/suffered_wound, dealt_damage, dealt_wound_bonus, dealt_bare_wound_bonus, base_roll) + var/message = "has suffered: [suffered_wound] to [suffered_wound.limb.name]" // maybe indicate if it's a promote/demote? + + if(dealt_damage) + message += " | Damage: [dealt_damage]" + // The base roll is useful since it can show how lucky someone got with the given attack. For example, dealing a cut + if(base_roll) + message += "(rolled [base_roll]/[dealt_damage ** WOUND_DAMAGE_EXPONENT])" + + if(dealt_wound_bonus) + message += " | WB: [dealt_wound_bonus]" + + if(dealt_bare_wound_bonus) + message += " | BWB: [dealt_bare_wound_bonus]" + + victim.log_message(message, LOG_ATTACK, color="blue") + // Filter stuff /atom/proc/add_filter(name,priority,list/params) LAZYINITLIST(filter_data) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index b73e6a57ff..226056b4ac 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -343,6 +343,10 @@ /obj/machinery/door/proc/crush() for(var/mob/living/L in get_turf(src)) L.visible_message("[src] closes on [L], crushing [L.p_them()]!", "[src] closes on you and crushes you!") + if(iscarbon(L)) + var/mob/living/carbon/C = L + for(var/datum/wound/W in C.all_wounds) + W.crush(DOOR_CRUSH_DAMAGE) if(isalien(L)) //For xenos L.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans. L.emote("roar") diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index fdc3aa30af..75024aec26 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -183,9 +183,21 @@ var/T = get_turf(target) if(locate(/mob/living) in T) new /obj/effect/temp_visual/medical_holosign(T,user) //produce a holographic glow - holo_cooldown = world.time + 100 + holo_cooldown = world.time + 10 SECONDS return +// see: [/datum/wound/burn/proc/uv()] +/obj/item/flashlight/pen/paramedic + name = "paramedic penlight" + desc = "A high-powered UV penlight intended to help stave off infection in the field on serious burned patients. Probably really bad to look into." + icon_state = "penlight_surgical" + /// Our current UV cooldown + var/uv_cooldown = 0 + /// How long between UV fryings + var/uv_cooldown_length = 1 MINUTES + /// How much sanitization to apply to the burn wound + var/uv_power = 1 + /obj/effect/temp_visual/medical_holosign name = "medical holosign" desc = "A small holographic glow that indicates a medic is coming to treat a patient." diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index bc6a721d13..5f86320830 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -10,6 +10,14 @@ NANITE SCANNER GENETICS SCANNER */ + +// Describes the three modes of scanning available for health analyzers +#define SCANMODE_HEALTH 0 +#define SCANMODE_CHEMICAL 1 +#define SCANMODE_WOUND 2 +#define SCANNER_CONDENSED 0 +#define SCANNER_VERBOSE 1 + /obj/item/t_scanner name = "\improper T-ray scanner" desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." @@ -80,7 +88,7 @@ GENETICS SCANNER throw_range = 7 custom_materials = list(/datum/material/iron=200) var/mode = 1 - var/scanmode = 0 + var/scanmode = SCANMODE_HEALTH var/advanced = FALSE /obj/item/healthanalyzer/suicide_act(mob/living/carbon/user) @@ -88,37 +96,40 @@ GENETICS SCANNER return BRUTELOSS /obj/item/healthanalyzer/attack_self(mob/user) - if(!scanmode) - to_chat(user, "You switch the health analyzer to scan chemical contents.") - scanmode = 1 - else - to_chat(user, "You switch the health analyzer to check physical health.") - scanmode = 0 + scanmode = (scanmode + 1) % 3 + switch(scanmode) + if(SCANMODE_HEALTH) + to_chat(user, "You switch the health analyzer to check physical health.") + if(SCANMODE_CHEMICAL) + to_chat(user, "You switch the health analyzer to scan chemical contents.") + if(SCANMODE_WOUND) + to_chat(user, "You switch the health analyzer to report extra info on wounds.") /obj/item/healthanalyzer/attack(mob/living/M, mob/living/carbon/human/user) + flick("[icon_state]-scan", src) //makes it so that it plays the scan animation upon scanning, including clumsy scanning // Clumsiness/brain damage check if ((HAS_TRAIT(user, TRAIT_CLUMSY) || HAS_TRAIT(user, TRAIT_DUMB)) && prob(50)) - to_chat(user, "You stupidly try to analyze the floor's vitals!") - user.visible_message("[user] has analyzed the floor's vitals!") - var/msg = "*---------*\nAnalyzing results for The floor:\n\tOverall status: Healthy\n" - msg += "Key: Suffocation/Toxin/Burn/Brute\n" - msg += "\tDamage specifics: 0-0-0-0\n" - msg += "Body temperature: ???\n" - msg += "*---------*" - to_chat(user, msg) + user.visible_message("[user] analyzes the floor's vitals!", \ + "You stupidly try to analyze the floor's vitals!") + to_chat(user, "Analyzing results for The floor:\n\tOverall status: Healthy\ + \nKey: Suffocation/Toxin/Burn/Brute\ + \n\tDamage specifics: 0-0-0-0\ + \nBody temperature: ???") return - user.visible_message("[user] has analyzed [M]'s vitals.") + user.visible_message("[user] analyzes [M]'s vitals.", \ + "You analyze [M]'s vitals.") - if(scanmode == 0) + if(scanmode == SCANMODE_HEALTH) healthscan(user, M, mode, advanced) - else if(scanmode == 1) + else if(scanmode == SCANMODE_CHEMICAL) chemscan(user, M) + else + woundscan(user, M, src) add_fingerprint(user) - // Used by the PDA medical scanner too /proc/healthscan(mob/user, mob/living/M, mode = 1, advanced = FALSE) if(isliving(user) && (user.incapacitated() || user.eye_blind)) @@ -402,6 +413,17 @@ GENETICS SCANNER msg += " Intervention recommended.\n" else msg += "\n" + // Wounds + if(iscarbon(M)) + var/mob/living/carbon/C = M + var/list/wounded_parts = C.get_wounded_bodyparts() + for(var/i in wounded_parts) + var/obj/item/bodypart/wounded_part = i + msg += "Warning: Physical trauma[LAZYLEN(wounded_part.wounds) > 1? "s" : ""] detected in [wounded_part.name]" + for(var/k in wounded_part.wounds) + var/datum/wound/W = k + msg += "
Type: [W.name]\nSeverity: [W.severity_text()]\nRecommended Treatment: [W.treat_text]
\n" // less lines than in woundscan() so we don't overload people trying to get basic med info + msg += "
\n" for(var/thing in M.diseases) var/datum/disease/D = thing @@ -414,7 +436,7 @@ GENETICS SCANNER var/blood_typepath = C.get_blood_id() if(blood_typepath) if(ishuman(C)) - if(H.bleed_rate) + if(H.is_bleeding()) msg += "Subject is bleeding!\n" var/blood_percent = round((C.scan_blood_volume() / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100) var/blood_type = C.dna.blood_type @@ -505,6 +527,63 @@ GENETICS SCANNER desc = "A hand-held body scanner able to distinguish vital signs of the subject with high accuracy." advanced = TRUE +/// Displays wounds with extended information on their status vs medscanners +/proc/woundscan(mob/user, mob/living/carbon/patient, obj/item/healthanalyzer/wound/scanner) + if(!istype(patient)) + return + + var/render_list = "" + for(var/i in patient.get_wounded_bodyparts()) + var/obj/item/bodypart/wounded_part = i + render_list += "Warning: Physical trauma[LAZYLEN(wounded_part.wounds) > 1? "s" : ""] detected in [wounded_part.name]" + for(var/k in wounded_part.wounds) + var/datum/wound/W = k + render_list += "
[W.get_scanner_description()]
\n" + render_list += "
" + + if(render_list == "") + playsound(scanner, 'sound/machines/ping.ogg', 50, FALSE) + to_chat(user, "\The [scanner] makes a happy ping and briefly displays a smiley face with several exclamation points! It's really excited to report that [patient] has no wounds!") + else + to_chat(user, jointext(render_list, "")) + +/obj/item/healthanalyzer/wound + name = "first aid analyzer" + icon_state = "adv_spectrometer" + desc = "A prototype MeLo-Tech medical scanner used to diagnose injuries and recommend treatment for serious wounds, but offers no further insight into the patient's health. You hope the final version is less annoying to read!" + var/next_encouragement + var/greedy + +/obj/item/healthanalyzer/wound/attack_self(mob/user) + if(next_encouragement < world.time) + playsound(src, 'sound/machines/ping.ogg', 50, FALSE) + var/list/encouragements = list("briefly displays a happy face, gazing emptily at you", "briefly displays a spinning cartoon heart", "displays an encouraging message about eating healthy and exercising", \ + "reminds you that everyone is doing their best", "displays a message wishing you well", "displays a sincere thank-you for your interest in first-aid", "formally absolves you of all your sins") + to_chat(user, "\The [src] makes a happy ping and [pick(encouragements)]!") + next_encouragement = world.time + 10 SECONDS + greedy = FALSE + else if(!greedy) + to_chat(user, "\The [src] displays an eerily high-definition frowny face, chastizing you for asking it for too much encouragement.") + greedy = TRUE + else + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + if(isliving(user)) + var/mob/living/L = user + to_chat(L, "\The [src] makes a disappointed buzz and pricks your finger for being greedy. Ow!") + L.adjustBruteLoss(4) + L.dropItemToGround(src) + +/obj/item/healthanalyzer/wound/attack(mob/living/carbon/patient, mob/living/carbon/human/user) + add_fingerprint(user) + user.visible_message("[user] scans [patient] for serious injuries.", "You scan [patient] for serious injuries.") + + if(!istype(patient)) + playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + to_chat(user, "\The [src] makes a sad buzz and briefly displays a frowny face, indicating it can't scan [patient].") + return + + woundscan(user, patient, src) + /obj/item/analyzer desc = "A hand-held environmental scanner which reports current gas levels. Alt-Click to use the built in barometer function." name = "analyzer" @@ -878,3 +957,9 @@ GENETICS SCANNER return "[HM.name] ([HM.alias])" else return HM.alias + +#undef SCANMODE_HEALTH +#undef SCANMODE_CHEMICAL +#undef SCANMODE_WOUND +#undef SCANNER_CONDENSED +#undef SCANNER_VERBOSE diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index 8c7049c713..08460993ee 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -23,6 +23,8 @@ max_integrity = 200 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 70) resistance_flags = FIRE_PROOF + wound_bonus = -110 + bare_wound_bonus = 20 block_parry_data = /datum/block_parry_data/dual_esword var/hacked = FALSE /// Can this reflect all energy projectiles? diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm index 41c1cbe915..7cb22d5eb0 100644 --- a/code/game/objects/items/fireaxe.dm +++ b/code/game/objects/items/fireaxe.dm @@ -17,6 +17,7 @@ max_integrity = 200 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) resistance_flags = FIRE_PROOF + wound_bonus = -20 var/wielded = FALSE // track wielded status on item /obj/item/fireaxe/Initialize() diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm index f51db9fa4c..16e8046ee2 100644 --- a/code/game/objects/items/grenades/flashbang.dm +++ b/code/game/objects/items/grenades/flashbang.dm @@ -60,6 +60,14 @@ shrapnel_type = /obj/item/projectile/bullet/pellet/stingball/mega shrapnel_radius = 12 +/obj/item/grenade/stingbang/breaker + name = "breakbang" + shrapnel_type = /obj/projectile/bullet/pellet/stingball/breaker + +/obj/item/grenade/stingbang/shred + name = "shredbang" + shrapnel_type = /obj/projectile/bullet/pellet/stingball/shred + /obj/item/grenade/stingbang/prime(mob/living/lanced_by) if(iscarbon(loc)) var/mob/living/carbon/C = loc diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index d6396f9902..691b4c4228 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -225,6 +225,7 @@ throwforce = 10 w_class = WEIGHT_CLASS_TINY obj_flags = UNIQUE_RENAME + wound_bonus = -10 var/chaplain_spawnable = TRUE total_mass = TOTAL_MASS_MEDIEVAL_WEAPON @@ -657,6 +658,8 @@ item_flags = ABSTRACT w_class = WEIGHT_CLASS_HUGE sharpness = IS_SHARP + wound_bonus = -20 + bare_wound_bonus = 25 total_mass = TOTAL_MASS_HAND_REPLACEMENT /obj/item/nullrod/armblade/Initialize() diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index 2c00265ce8..8f274c04aa 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -79,6 +79,8 @@ sharpness = IS_SHARP_ACCURATE armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) var/bayonet = FALSE //Can this be attached to a gun? + wound_bonus = -5 + bare_wound_bonus = 10 custom_price = PRICE_NORMAL /obj/item/kitchen/knife/Initialize() diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index 6c01e68a48..0673e1d489 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -506,7 +506,9 @@ if(prob(50)) step(W, pick(GLOB.alldirs)) ADD_TRAIT(H, TRAIT_DISFIGURED, TRAIT_GENERIC) - H.bleed_rate = 5 + for(var/i in H.bodyparts) + var/obj/item/bodypart/BP = i + BP.generic_bleedstacks += 5 H.gib_animation() sleep(3) H.adjustBruteLoss(1000) //to make the body super-bloody diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index c6aa9f7bf4..bb7ef267cf 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -19,6 +19,8 @@ slot_flags = ITEM_SLOT_BELT force = 14 throwforce = 10 + wound_bonus = 15 + bare_wound_bonus = 10 reach = 2 w_class = WEIGHT_CLASS_NORMAL attack_verb = list("flogged", "whipped", "lashed", "disciplined") @@ -268,6 +270,8 @@ var/force_off // Damage when off - not stunning var/weight_class_on // What is the new size class when turned on + wound_bonus = 15 + /obj/item/melee/classic_baton/Initialize() . = ..() @@ -393,6 +397,7 @@ force_off = 0 weight_class_on = WEIGHT_CLASS_BULKY total_mass = TOTAL_MASS_NORMAL_ITEM + bare_wound_bonus = 5 /obj/item/melee/classic_baton/telescopic/suicide_act(mob/user) var/mob/living/carbon/human/H = user diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index b7e2d22d2f..52f4b3462e 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -98,7 +98,7 @@ target.visible_message("[user]'s powerfist lets out a weak hiss as [user.p_they()] punch[user.p_es()] [target.name]!", \ "[user]'s punch strikes with force!") return - target.apply_damage(totalitemdamage * fisto_setting, BRUTE) + target.apply_damage(totalitemdamage * fisto_setting, BRUTE, wound_bonus = -25*fisto_setting**2) target.visible_message("[user]'s powerfist lets out a loud hiss as [user.p_they()] punch[user.p_es()] [target.name]!", \ "You cry out in pain as [user]'s punch flings you backwards!") new /obj/effect/temp_visual/kinetic_blast(target.loc) diff --git a/code/game/objects/items/shrapnel.dm b/code/game/objects/items/shrapnel.dm index 7108080ecc..de8bf9459d 100644 --- a/code/game/objects/items/shrapnel.dm +++ b/code/game/objects/items/shrapnel.dm @@ -7,11 +7,13 @@ icon_state = "large" w_class = WEIGHT_CLASS_TINY item_flags = DROPDEL + sharpness = TRUE /obj/item/shrapnel/stingball // stingbang grenades name = "stingball" embedding = list(embed_chance=90, fall_chance=3, jostle_chance=7, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.7, pain_mult=5, jostle_pain_mult=6, rip_time=15, embed_chance_turf_mod=-100) icon_state = "tiny" + sharpness = FALSE /obj/item/shrapnel/bullet // bullets name = "bullet" @@ -28,7 +30,7 @@ /obj/item/projectile/bullet/shrapnel name = "flying shrapnel shard" - damage = 9 + damage = 8 range = 10 armour_penetration = -30 dismemberment = 5 @@ -36,6 +38,8 @@ ricochet_chance = 40 shrapnel_type = /obj/item/shrapnel ricochet_incidence_leeway = 60 + sharpness = TRUE + wound_bonus = 30 /obj/item/projectile/bullet/shrapnel/mega name = "flying shrapnel hunk" @@ -62,3 +66,15 @@ name = "megastingball pellet" ricochets_max = 6 ricochet_chance = 110 + +/obj/projectile/bullet/pellet/stingball/breaker + name = "breakbang pellet" + damage = 10 + wound_bonus = 40 + sharpness = FALSE + +/obj/projectile/bullet/pellet/stingball/shred + name = "shredbang pellet" + damage = 10 + wound_bonus = 30 + sharpness = TRUE diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index 376362d7c3..41cb68559b 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -22,6 +22,8 @@ var/war_cry = "AAAAARGH!!!" var/icon_prefix = "spearglass" var/wielded = FALSE // track wielded status on item + wound_bonus = -25 + bare_wound_bonus = 15 /obj/item/spear/Initialize() . = ..() diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index e6403e83cc..8a0f4fe13a 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -15,6 +15,16 @@ var/self_delay = 50 var/other_delay = 0 var/repeating = FALSE + /// How much brute we heal per application + var/heal_brute + /// How much burn we heal per application + var/heal_burn + /// How much we reduce bleeding per application on cut wounds + var/stop_bleeding + /// How much sanitization to apply to burns on application + var/sanitization + /// How much we add to flesh_healing for burn wounds on application + var/flesh_regeneration /obj/item/stack/medical/attack(mob/living/M, mob/user) . = ..() @@ -70,8 +80,9 @@ icon_state = "brutepack" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - var/heal_brute = 20 - self_delay = 20 + heal_brute = 40 + self_delay = 40 + other_delay = 20 grind_results = list(/datum/reagent/medicine/styptic_powder = 10) /obj/item/stack/medical/bruise_pack/one @@ -95,7 +106,8 @@ M.heal_bodypart_damage((heal_brute/2)) return TRUE if(iscarbon(M)) - return heal_carbon(M, user, heal_brute, 0) + return heal_carbon(M, user, heal_brute, heal_burn) + to_chat(user, "You can't heal [M] with \the [src]!") to_chat(user, "You can't heal [M] with the \the [src]!") /obj/item/stack/medical/bruise_pack/suicide_act(mob/user) @@ -104,24 +116,27 @@ /obj/item/stack/medical/gauze name = "medical gauze" - desc = "A roll of elastic cloth that is extremely effective at stopping bleeding, heals minor wounds." + desc = "A roll of elastic cloth, perfect for stabilizing all kinds of wounds, from cuts and burns, to broken bones. " gender = PLURAL singular_name = "medical gauze" icon_state = "gauze" - var/stop_bleeding = 1800 var/heal_brute = 5 - self_delay = 10 + self_delay = 50 + other_delay = 20 + amount = 6 + absorption_rate = 0.25 + absorption_capacity = 5 + splint_factor = 0.35 custom_price = PRICE_REALLY_CHEAP -/obj/item/stack/medical/gauze/heal(mob/living/M, mob/user) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!H.bleedsuppress && H.bleed_rate) //so you can't stack bleed suppression - H.suppress_bloodloss(stop_bleeding) - to_chat(user, "You stop the bleeding of [M]!") - H.adjustBruteLoss(-(heal_brute)) - return TRUE - to_chat(user, "You can not use \the [src] on [M]!") +// gauze is only relevant for wounds, which are handled in the wounds themselves +/obj/item/stack/medical/gauze/try_heal(mob/living/M, mob/user, silent) + var/obj/item/bodypart/limb = M.get_bodypart(check_zone(user.zone_selected)) + if(limb) + if(limb.brute_dam > 40) + to_chat(user, "The bleeding on [user==M ? "your" : "[M]'s"] [limb.name] is from bruising, and cannot be treated with [src]!") + else + to_chat(user, "There's no bleeding on [user==M ? "your" : "[M]'s"] [limb.name]") /obj/item/stack/medical/gauze/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness()) @@ -143,9 +158,12 @@ /obj/item/stack/medical/gauze/improvised name = "improvised gauze" singular_name = "improvised gauze" - desc = "A roll of cloth roughly cut from something that can stop bleeding, but does not heal wounds." - stop_bleeding = 900 heal_brute = 0 + desc = "A roll of cloth roughly cut from something that does a decent job of stabilizing wounds, but less efficiently so than real medical gauze." + self_delay = 60 + other_delay = 30 + absorption_rate = 0.15 + absorption_capacity = 4 /obj/item/stack/medical/gauze/adv name = "sterilized medical gauze" @@ -161,49 +179,28 @@ is_cyborg = 1 cost = 250 -/obj/item/stack/medical/ointment - name = "ointment" - desc = "Used to treat those nasty burn wounds." - gender = PLURAL - singular_name = "ointment" - icon_state = "ointment" - lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - var/heal_burn = 20 - self_delay = 20 - grind_results = list(/datum/reagent/medicine/silver_sulfadiazine = 10) - -/obj/item/stack/medical/ointment/one - amount = 1 - -/obj/item/stack/medical/ointment/heal(mob/living/M, mob/user) - if(M.stat == DEAD) - to_chat(user, " [M] is dead. You can not help [M.p_them()]!") - return - if(iscarbon(M)) - return heal_carbon(M, user, 0, heal_burn) - if(AmBloodsucker(M)) - return - to_chat(user, "You can't heal [M] with the \the [src]!") - -/obj/item/stack/medical/ointment/suicide_act(mob/living/user) - user.visible_message("[user] is squeezing \the [src] into [user.p_their()] mouth! [user.p_do(TRUE)]n't [user.p_they()] know that stuff is toxic?") - return TOXLOSS - /obj/item/stack/medical/suture name = "suture" - desc = "Sterile sutures used to seal up cuts and lacerations." + desc = "Basic sterile sutures used to seal up cuts and lacerations and stop bleeding." gender = PLURAL singular_name = "suture" icon_state = "suture" self_delay = 30 other_delay = 10 - amount = 15 - max_amount = 15 + amount = 10 + max_amount = 10 repeating = TRUE - var/heal_brute = 10 + heal_brute = 10 + stop_bleeding = 0.6 grind_results = list(/datum/reagent/medicine/spaceacillin = 2) +/obj/item/stack/medical/suture/emergency + name = "emergency suture" + desc = "A value pack of cheap sutures, not very good at repairing damage, but still decent at stopping bleeding." + heal_brute = 5 + amount = 5 + max_amount = 5 + /obj/item/stack/medical/suture/one amount = 1 @@ -223,10 +220,40 @@ to_chat(user, "[M] is at full health.") return FALSE user.visible_message("[user] applies \the [src] on [M].", "You apply \the [src] on [M].") - M.heal_bodypart_damage(heal_brute) + return heal_carbon(M, user, heal_brute, heal_burn) return TRUE - to_chat(user, "You can't heal [M] with the \the [src]!") + to_chat(user, "You can't heal [M] with \the [src]!") + +/obj/item/stack/medical/ointment + name = "ointment" + desc = "Basic burn ointment, rated effective for second degree burns with proper bandaging, though it's still an effective stabilizer for worse burns. Not terribly good at outright healing burns though." + gender = PLURAL + singular_name = "ointment" + icon_state = "ointment" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + amount = 10 + max_amount = 10 + self_delay = 40 + other_delay = 20 + + heal_burn = 5 + flesh_regeneration = 2.5 + sanitization = 0.3 + grind_results = list(/datum/reagent/medicine/C2/lenturi = 10) + +/obj/item/stack/medical/ointment/heal(mob/living/M, mob/user) + if(M.stat == DEAD) + to_chat(user, "[M] is dead! You can not help [M.p_them()].") + return + if(iscarbon(M)) + return heal_carbon(M, user, heal_brute, heal_burn) + to_chat(user, "You can't heal [M] with \the [src]!") + +/obj/item/stack/medical/ointment/suicide_act(mob/living/user) + user.visible_message("[user] is squeezing \the [src] into [user.p_their()] mouth! [user.p_do(TRUE)]n't [user.p_they()] know that stuff is toxic?") + return TOXLOSS /obj/item/stack/medical/mesh name = "regenerative mesh" @@ -237,9 +264,11 @@ self_delay = 30 other_delay = 10 amount = 15 + heal_burn = 10 max_amount = 15 repeating = TRUE - var/heal_burn = 10 + sanitization = 0.75 + flesh_regeneration = 3 var/is_open = TRUE ///This var determines if the sterile packaging of the mesh has been opened. grind_results = list(/datum/reagent/medicine/spaceacillin = 2) @@ -264,8 +293,8 @@ to_chat(user, "[M] is dead! You can not help [M.p_them()].") return if(iscarbon(M)) - return heal_carbon(M, user, 0, heal_burn) - to_chat(user, "You can't heal [M] with the \the [src]!") + return heal_carbon(M, user, heal_brute, heal_burn) + to_chat(user, "You can't heal [M] with \the [src]!") /obj/item/stack/medical/mesh/try_heal(mob/living/M, mob/user, silent = FALSE) @@ -294,3 +323,49 @@ playsound(src, 'sound/items/poster_ripped.ogg', 20, TRUE) return . = ..() + +/obj/item/stack/medical/bone_gel + name = "bone gel" + singular_name = "bone gel" + desc = "A potent medical gel that, when applied to a damaged bone in a proper surgical setting, triggers an intense melding reaction to repair the wound. Can be directly applied alongside surgical sticky tape to a broken bone in dire circumstances, though this is very harmful to the patient and not recommended." + + icon = 'icons/obj/surgery.dmi' + icon_state = "bone-gel" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + + amount = 4 + self_delay = 20 + grind_results = list(/datum/reagent/medicine/C2/libital = 10) + novariants = TRUE + +/obj/item/stack/medical/bone_gel/attack(mob/living/M, mob/user) + to_chat(user, "Bone gel can only be used on fractured limbs!") + return + +/obj/item/stack/medical/bone_gel/suicide_act(mob/user) + if(iscarbon(user)) + var/mob/living/carbon/C = user + C.visible_message("[C] is squirting all of \the [src] into [C.p_their()] mouth! That's not proper procedure! It looks like [C.p_theyre()] trying to commit suicide!") + if(do_after(C, 2 SECONDS)) + C.emote("scream") + for(var/i in C.bodyparts) + var/obj/item/bodypart/bone = i + var/datum/wound/brute/bone/severe/oof_ouch = new + oof_ouch.apply_wound(bone) + var/datum/wound/brute/bone/critical/oof_OUCH = new + oof_OUCH.apply_wound(bone) + + for(var/i in C.bodyparts) + var/obj/item/bodypart/bone = i + bone.receive_damage(brute=60) + use(1) + return (BRUTELOSS) + else + C.visible_message("[C] screws up like an idiot and still dies anyway!") + return (BRUTELOSS) + +/obj/item/stack/medical/bone_gel/cyborg + custom_materials = null + is_cyborg = 1 + cost = 250 diff --git a/tgstation.dme b/tgstation.dme index 1641b4f9a7..9c1f8a2378 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -119,6 +119,7 @@ #include "code\__DEFINES\vv.dm" #include "code\__DEFINES\wall_dents.dm" #include "code\__DEFINES\wires.dm" +#include "code\__DEFINES\wounds.dm" #include "code\__DEFINES\_flags\_flags.dm" #include "code\__DEFINES\_flags\item_flags.dm" #include "code\__DEFINES\_flags\obj_flags.dm" @@ -624,6 +625,7 @@ #include "code\datums\status_effects\gas.dm" #include "code\datums\status_effects\neutral.dm" #include "code\datums\status_effects\status_effect.dm" +#include "code\datums\status_effects\wound_effects.dm" #include "code\datums\traits\_quirk.dm" #include "code\datums\traits\good.dm" #include "code\datums\traits\negative.dm" @@ -651,6 +653,8 @@ #include "code\datums\wires\syndicatebomb.dm" #include "code\datums\wires\tesla_coil.dm" #include "code\datums\wires\vending.dm" +#include "code\datums\wounds\_scars.dm" +#include "code\datums\wounds\cuts.dm" #include "code\game\alternate_appearance.dm" #include "code\game\atoms.dm" #include "code\game\atoms_movable.dm" From b2e95792171a2d81fafb8594a5d454d95ffdd630 Mon Sep 17 00:00:00 2001 From: TheSpaghetti <37235090+TheSpaghetti@users.noreply.github.com> Date: Fri, 17 Jul 2020 00:48:45 -0400 Subject: [PATCH 028/122] Fixes typos in the light sensitivity trait. It was bothering me. --- code/datums/traits/negative.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 8f902fa088..1566baa421 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -173,9 +173,9 @@ GLOBAL_LIST_EMPTY(family_heirlooms) name = "Light Sensitivity" desc = "Bright lights irritate you. Your eyes start to water, your skin feels itchy against the photon radiation, and your hair gets dry and frizzy. Maybe it's a medical condition. If only Nanotrasen was more considerate of your needs..." value = -1 - gain_text = "The safty of light feels off..." + gain_text = "The safety of light feels off..." lose_text = "Enlightening." - medical_record_text = "Despite my warnings, the patient refuses turn on the lights, only to end up rolling down a full flight of stairs and into the cellar." + medical_record_text = "Despite my warnings, the patient refuses to turn on the lights, only to end up rolling down a full flight of stairs and into the cellar." /datum/quirk/lightless/on_process() var/turf/T = get_turf(quirk_holder) From 813fd9b3e0a48449073b3e995df8bfd39316ce2f Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 17 Jul 2020 09:00:02 -0700 Subject: [PATCH 029/122] Update shields.dm --- code/game/objects/items/shields.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 154714b13f..992c173d3b 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -446,6 +446,12 @@ obj/item/shield/riot/bullet_proof return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT return ..() +/obj/item/shield/energy/active_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, override_direction) + if((attack_type & ATTACK_TYPE_PROJECTILE) && is_energy_reflectable_projectile(object)) + block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_DEFLECT + return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT + return ..() + /obj/item/shield/energy/attack_self(mob/living/carbon/human/user) if(clumsy_check && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) to_chat(user, "You beat yourself in the head with [src]!") From 73a758adc83d9d69e1977b72f15a0dc5304481a5 Mon Sep 17 00:00:00 2001 From: Artur Date: Fri, 17 Jul 2020 22:05:46 +0300 Subject: [PATCH 030/122] Decal Painter fix --- code/game/objects/items/airlock_painter.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index c9a31a48c2..4f3761f899 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -183,7 +183,7 @@ /obj/item/airlock_painter/decal/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "decal_painter", name, 500, 400, master_ui, state) + ui = new(user, src, ui_key, "DecalPainter", name, 500, 400, master_ui, state) ui.open() /obj/item/airlock_painter/decal/ui_data(mob/user) @@ -233,4 +233,4 @@ /obj/item/airlock_painter/decal/debug/Initialize() . = ..() - ink = new /obj/item/toner/extreme(src) \ No newline at end of file + ink = new /obj/item/toner/extreme(src) From 82e0a3b66b99dd3b202d9ee95f76099716958144 Mon Sep 17 00:00:00 2001 From: SiliconMain <65544193+SiliconMain@users.noreply.github.com> Date: Fri, 17 Jul 2020 14:32:46 -0500 Subject: [PATCH 031/122] Update geiger_counter.dm --- code/game/objects/items/devices/geiger_counter.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index 5cab9e33de..f5d3014d35 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -18,6 +18,7 @@ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' w_class = WEIGHT_CLASS_SMALL slot_flags = ITEM_SLOT_BELT + rad_flags = RAD_NO_CONTAMINATE custom_materials = list(/datum/material/iron = 150, /datum/material/glass = 150) var/grace = RAD_GRACE_PERIOD From 6cd9993e507c86c9d08f438adb0feb0174a64ee4 Mon Sep 17 00:00:00 2001 From: kappa-sama <44128284+kappa-sama@users.noreply.github.com> Date: Fri, 17 Jul 2020 15:54:45 -0400 Subject: [PATCH 032/122] 5 --- code/modules/events/stray_cargo.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/stray_cargo.dm b/code/modules/events/stray_cargo.dm index 02d02a8510..031642c875 100644 --- a/code/modules/events/stray_cargo.dm +++ b/code/modules/events/stray_cargo.dm @@ -2,7 +2,7 @@ /datum/round_event_control/stray_cargo name = "Stray Cargo Pod" typepath = /datum/round_event/stray_cargo - weight = 20 + weight = 5 max_occurrences = 4 earliest_start = 10 MINUTES From a4478b0cdab72ca7b6066f62be53e5c4e6ebe38c Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Fri, 17 Jul 2020 22:38:28 +0100 Subject: [PATCH 033/122] it continues --- code/game/objects/items/stacks/stack.dm | 9 + code/game/objects/items/stacks/tape.dm | 16 +- code/game/objects/items/storage/backpack.dm | 3 + code/game/objects/items/storage/belt.dm | 5 +- code/game/objects/items/storage/firstaid.dm | 20 ++- code/game/objects/items/storage/toolbox.dm | 1 + code/game/objects/items/weaponry.dm | 4 +- code/game/objects/objs.dm | 5 + code/game/objects/structures/guillotine.dm | 2 +- code/game/objects/structures/tables_racks.dm | 32 ++-- code/modules/admin/verbs/randomverbs.dm | 32 +++- .../blob/blob/blobstrains/blazing_oil.dm | 2 +- .../blob/blob/blobstrains/cryogenic_poison.dm | 2 +- .../blob/blobstrains/electromagnetic_web.dm | 2 +- .../blob/blobstrains/explosive_lattice.dm | 6 +- .../blob/blob/blobstrains/networked_fibers.dm | 4 +- .../blob/blobstrains/pressurized_slime.dm | 2 +- .../blob/blob/blobstrains/replicating_foam.dm | 2 +- .../blob/blobstrains/shifting_fragments.dm | 2 +- .../blob/blob/blobstrains/synchronous_mesh.dm | 4 +- .../changeling/powers/fleshmend.dm | 2 +- .../changeling/powers/mutations.dm | 2 + .../changeling/powers/regenerate.dm | 3 + code/modules/antagonists/cult/cult_items.dm | 6 +- .../antagonists/slaughter/slaughter.dm | 48 ++++- .../antagonists/slaughter/slaughter_antag.dm | 1 + .../components/unary_devices/cryo.dm | 32 +++- code/modules/cargo/packs/goodies.dm | 6 + code/modules/cargo/packs/medical.dm | 4 +- code/modules/client/preferences.dm | 21 +++ code/modules/client/preferences_savefile.dm | 23 +++ code/modules/clothing/clothing.dm | 165 ++++++++++++++++-- code/modules/clothing/gloves/_gloves.dm | 2 +- code/modules/clothing/head/_head.dm | 2 +- code/modules/clothing/masks/_masks.dm | 2 +- code/modules/clothing/shoes/_shoes.dm | 2 +- code/modules/clothing/suits/_suits.dm | 3 +- code/modules/clothing/suits/armor.dm | 19 +- code/modules/clothing/suits/wiz_robe.dm | 2 +- code/modules/clothing/under/_under.dm | 5 +- code/modules/clothing/under/jobs/cargo.dm | 3 +- code/modules/clothing/under/jobs/command.dm | 1 + code/modules/clothing/under/jobs/security.dm | 8 +- .../browserassets/css/browserOutput.css | 2 + code/modules/hydroponics/grown/nettle.dm | 1 + .../jobs/job_types/chief_medical_officer.dm | 2 +- code/modules/jobs/job_types/paramedic.dm | 2 +- .../modules/mining/equipment/explorer_gear.dm | 4 +- .../modules/mob/dead/new_player/new_player.dm | 13 ++ code/modules/mob/living/blood.dm | 57 +++--- code/modules/mob/living/brain/brain_item.dm | 4 +- code/modules/mob/living/carbon/carbon.dm | 94 +++++++++- 52 files changed, 560 insertions(+), 136 deletions(-) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 16b46567c7..bf6f2aba2e 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -25,9 +25,18 @@ var/list/mats_per_unit //list that tells you how much is in a single unit. ///Datum material type that this stack is made of var/material_type + max_integrity = 100 //NOTE: When adding grind_results, the amounts should be for an INDIVIDUAL ITEM - these amounts will be multiplied by the stack size in on_grind() var/obj/structure/table/tableVariant // we tables now (stores table variant to be built from this stack) + // The following are all for medical treatment, they're here instead of /stack/medical because sticky tape can be used as a makeshift bandage or splint + /// If set and this used as a splint for a broken bone wound, this is used as a multiplier for applicable slowdowns (lower = better) (also for speeding up burn recoveries) + var/splint_factor + /// How much blood flow this stack can absorb if used as a bandage on a cut wound, note that absorption is how much we lower the flow rate, not the raw amount of blood we suck up + var/absorption_capacity + /// How quickly we lower the blood flow on a cut wound we're bandaging. Expected lifetime of this bandage in ticks is thus absorption_capacity/absorption_rate, or until the cut heals, whichever comes first + var/absorption_rate + /obj/item/stack/on_grind() for(var/i in 1 to grind_results.len) //This should only call if it's ground, so no need to check if grind_results exists grind_results[grind_results[i]] *= get_amount() //Gets the key at position i, then the reagent amount of that key, then multiplies it by stack size diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm index d33d106d11..ed5baf733b 100644 --- a/code/game/objects/items/stacks/tape.dm +++ b/code/game/objects/items/stacks/tape.dm @@ -7,10 +7,13 @@ icon = 'icons/obj/tapes.dmi' icon_state = "tape_w" var/prefix = "sticky" + w_class = WEIGHT_CLASS_TINY + full_w_class = WEIGHT_CLASS_TINY item_flags = NOBLUDGEON amount = 5 max_amount = 5 resistance_flags = FLAMMABLE + splint_factor = 0.8 var/list/conferred_embed = EMBED_HARMLESS var/overwrite_existing = FALSE @@ -53,6 +56,7 @@ icon_state = "tape_y" prefix = "super sticky" conferred_embed = EMBED_HARMLESS_SUPERIOR + splint_factor = 0.6 /obj/item/stack/sticky_tape/pointy name = "pointy tape" @@ -68,4 +72,14 @@ desc = "You didn't know tape could look so sinister. Welcome to Space Station 13." icon_state = "tape_spikes" prefix = "super pointy" - conferred_embed = EMBED_POINTY_SUPERIOR \ No newline at end of file + conferred_embed = EMBED_POINTY_SUPERIOR + +/obj/item/stack/sticky_tape/surgical + name = "surgical tape" + singular_name = "surgical tape" + desc = "Made for patching broken bones back together alongside bone gel, not for playing pranks." + //icon_state = "tape_spikes" + prefix = "surgical" + conferred_embed = list("embed_chance" = 30, "pain_mult" = 0, "jostle_pain_mult" = 0, "ignore_throwspeed_threshold" = TRUE) + splint_factor = 0.4 + custom_price = 500 diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 3d5f0dc924..2c2c315fc9 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -369,6 +369,7 @@ new /obj/item/circular_saw(src) new /obj/item/surgicaldrill(src) new /obj/item/cautery(src) + new /obj/item/bonesetter(src) new /obj/item/surgical_drapes(src) new /obj/item/clothing/mask/surgical(src) new /obj/item/reagent_containers/medspray/sterilizine(src) @@ -391,6 +392,7 @@ new /obj/item/circular_saw(src) new /obj/item/surgicaldrill(src) new /obj/item/cautery(src) + new /obj/item/bonesetter(src) new /obj/item/surgical_drapes(src) new /obj/item/clothing/mask/surgical(src) new /obj/item/reagent_containers/medspray/sterilizine(src) @@ -485,6 +487,7 @@ new /obj/item/circular_saw(src) new /obj/item/surgicaldrill(src) new /obj/item/cautery(src) + new /obj/item/bonesetter(src) new /obj/item/surgical_drapes(src) new /obj/item/clothing/suit/straight_jacket(src) new /obj/item/clothing/mask/muzzle(src) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 4fa742df46..52e8e9193f 100755 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -162,6 +162,7 @@ /obj/item/surgical_drapes, //for true paramedics /obj/item/scalpel, /obj/item/circular_saw, + /obj/item/bonesetter, /obj/item/surgicaldrill, /obj/item/retractor, /obj/item/cautery, @@ -181,7 +182,8 @@ /obj/item/implant, /obj/item/implanter, /obj/item/pinpointer/crew, - /obj/item/reagent_containers/chem_pack + /obj/item/reagent_containers/chem_pack, + /obj/item/stack/sticky_tape //surgical tape )) /obj/item/storage/belt/medical/surgery_belt_adv @@ -811,4 +813,3 @@ attack_verb = list("bashed", "slashes", "prods", "pokes") fitting_swords = list(/obj/item/melee/rapier) starting_sword = /obj/item/melee/rapier - diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index d7065df0f0..fb1313fc70 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -41,9 +41,26 @@ new /obj/item/stack/medical/suture(src) new /obj/item/stack/medical/mesh(src) new /obj/item/stack/medical/mesh(src) - new /obj/item/reagent_containers/hypospray/medipen(src) + new /obj/item/reagent_containers/hypospray/medipen/ekit(src) new /obj/item/healthanalyzer(src) +/obj/item/storage/firstaid/emergency + icon_state = "medbriefcase" + name = "emergency first-aid kit" + desc = "A very simple first aid kit meant to secure and stabilize serious wounds for later treatment." + +/obj/item/storage/firstaid/emergency/PopulateContents() + if(empty) + return + var/static/items_inside = list( + /obj/item/healthanalyzer/wound = 1, + /obj/item/stack/medical/gauze = 1, + /obj/item/stack/medical/suture/emergency = 1, + /obj/item/stack/medical/ointment = 1, + /obj/item/reagent_containers/hypospray/medipen/ekit = 2, + /obj/item/storage/pill_bottle/iron = 1) + generate_items_inside(items_inside,src) + /obj/item/storage/firstaid/ancient icon_state = "firstaid" desc = "A first aid kit with the ability to heal common types of injuries." @@ -416,6 +433,7 @@ /obj/item/retractor, /obj/item/cautery, /obj/item/surgical_drapes, + /obj/item/bonesetter, /obj/item/autosurgeon, /obj/item/organ, /obj/item/implant, diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index fd50bd022f..5e3ff67f4c 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -20,6 +20,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) var/has_latches = TRUE var/can_rubberify = TRUE rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //very protecc too + wound_bonus = 5 /obj/item/storage/toolbox/greyscale icon_state = "toolbox_default" diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 7524bb93e1..b23b7b0c24 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -574,6 +574,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' force = 10 + wound_bonus = -10 throwforce = 12 attack_verb = list("beat", "smacked") custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 3.5) @@ -626,7 +627,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 homerun_ready = 0 return else if(!target.anchored) - target.throw_at(throw_target, rand(1,2), 7, user) + var/whack_speed = (prob(60) ? 1 : 4) + target.throw_at(throw_target, rand(1, 2), whack_speed, user) // sorry friends, 7 speed batting caused wounds to absolutely delete whoever you knocked your target into (and said target) /obj/item/melee/baseball_bat/ablative name = "metal baseball bat" diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index ba3eba9bd3..c54c49b7e5 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -10,6 +10,11 @@ var/damtype = BRUTE var/force = 0 + /// How good a given object is at causing wounds on carbons. Higher values equal better shots at creating serious wounds. + var/wound_bonus = 0 + /// If this attacks a human with no wound armor on the affected body part, add this to the wound mod. Some attacks may be significantly worse at wounding if there's even a slight layer of armor to absorb some of it vs bare flesh + var/bare_wound_bonus = 0 + var/datum/armor/armor var/obj_integrity //defaults to max_integrity var/max_integrity = 500 diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm index 0a5ba6a68c..029cc67c81 100644 --- a/code/game/objects/structures/guillotine.dm +++ b/code/game/objects/structures/guillotine.dm @@ -108,7 +108,7 @@ if (QDELETED(head)) return - playsound(src, 'sound/weapons/bladeslice.ogg', 100, 1) + playsound(src, 'sound/weapons/guillotine.ogg', 100, TRUE) if (blade_sharpness >= GUILLOTINE_DECAP_MIN_SHARP || head.brute_dam >= 100) head.dismember() log_combat(user, H, "beheaded", src) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 777be608b5..50c58b0ade 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -71,7 +71,7 @@ if(user.grab_state < GRAB_AGGRESSIVE) to_chat(user, "You need a better grip to do that!") return - tablepush(user, pushed_mob) + tablelimbsmash(user, pushed_mob) if(user.a_intent == INTENT_HELP) pushed_mob.visible_message("[user] begins to place [pushed_mob] onto [src]...", \ "[user] begins to place [pushed_mob] onto [src]...") @@ -114,29 +114,17 @@ "[user] places [pushed_mob] onto [src].") log_combat(user, pushed_mob, "placed") -/obj/structure/table/proc/tablepush(mob/living/user, mob/living/pushed_mob) - if(HAS_TRAIT(user, TRAIT_PACIFISM)) +/obj/structure/table/proc/tablelimbsmash(mob/living/user, mob/living/pushed_mob) + if(HAS_TRAIT(user, TRAIT_PACIFISM)) //this shouldnt even be possible anyway because you cant get them in an aggressive grab, but whatever to_chat(user, "Throwing [pushed_mob] onto the table might hurt them!") return - var/added_passtable = FALSE - if(!pushed_mob.pass_flags & PASSTABLE) - added_passtable = TRUE - pushed_mob.pass_flags |= PASSTABLE - pushed_mob.Move(src.loc) - if(added_passtable) - pushed_mob.pass_flags &= ~PASSTABLE - if(pushed_mob.loc != loc) //Something prevented the tabling - return - pushed_mob.DefaultCombatKnockdown(40) - pushed_mob.visible_message("[user] slams [pushed_mob] onto [src]!", \ - "[user] slams you onto [src]!") - log_combat(user, pushed_mob, "tabled", null, "onto [src]") - if(!ishuman(pushed_mob)) - return - var/mob/living/carbon/human/H = pushed_mob - if(iscatperson(H)) - H.emote("nya") - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table) + pushed_mob.Knockdown(30) + var/obj/item/bodypart/banged_limb = pushed_mob.get_bodypart(user.zone_selected) || pushed_mob.get_bodypart(BODY_ZONE_HEAD) + var/extra_wound = 0 + if(HAS_TRAIT(user, TRAIT_HULK)) + extra_wound = 20 + banged_limb.receive_damage(30, wound_bonus = extra_wound) + pushed_mob.apply_damage(60, STAMINA) /obj/structure/table/shove_act(mob/living/target, mob/living/user) if(CHECK_MOBILITY(target, MOBILITY_STAND)) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index d335cfb171..c5cde07761 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1276,7 +1276,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits if(!check_rights(R_ADMIN) || !check_rights(R_FUN)) return - var/list/punishment_list = list(ADMIN_PUNISHMENT_PIE, ADMIN_PUNISHMENT_CUSTOM_PIE, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_SUPPLYPOD_QUICK, ADMIN_PUNISHMENT_SUPPLYPOD, ADMIN_PUNISHMENT_MAZING, ADMIN_PUNISHMENT_ROD) + var/list/punishment_list = list(ADMIN_PUNISHMENT_PIE, ADMIN_PUNISHMENT_CUSTOM_PIE, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_SUPPLYPOD_QUICK, ADMIN_PUNISHMENT_SUPPLYPOD, ADMIN_PUNISHMENT_MAZING, ADMIN_PUNISHMENT_ROD, ADMIN_PUNISHMENT_CRACK, ADMIN_PUNISHMENT_BLEED, ADMIN_PUNISHMENT_SCARIFY) var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list @@ -1341,7 +1341,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits if(ADMIN_PUNISHMENT_PIE) var/obj/item/reagent_containers/food/snacks/pie/cream/nostun/creamy = new(get_turf(target)) creamy.splat(target) - if (ADMIN_PUNISHMENT_CUSTOM_PIE) + if(ADMIN_PUNISHMENT_CUSTOM_PIE) var/obj/item/reagent_containers/food/snacks/pie/cream/nostun/A = new() if(!A.reagents) var/amount = input(usr, "Specify the reagent size of [A]", "Set Reagent Size", 50) as num|null @@ -1354,7 +1354,33 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits if(amount) A.reagents.add_reagent(chosen_id, amount) A.splat(target) - + if(ADMIN_PUNISHMENT_CRACK) + if(!iscarbon(target)) + to_chat(usr,"This must be used on a carbon mob.", confidential = TRUE) + return + var/mob/living/carbon/C = target + for(var/obj/item/bodypart/squish_part in C.bodyparts) + var/type_wound = pick(list(/datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/moderate)) + squish_part.force_wound_upwards(type_wound, smited=TRUE) + if(ADMIN_PUNISHMENT_BLEED) + if(!iscarbon(target)) + to_chat(usr,"This must be used on a carbon mob.", confidential = TRUE) + return + var/mob/living/carbon/C = target + for(var/obj/item/bodypart/slice_part in C.bodyparts) + var/type_wound = pick(list(/datum/wound/brute/cut/severe, /datum/wound/brute/cut/moderate)) + slice_part.force_wound_upwards(type_wound, smited=TRUE) + type_wound = pick(list(/datum/wound/brute/cut/critical, /datum/wound/brute/cut/severe, /datum/wound/brute/cut/moderate)) + slice_part.force_wound_upwards(type_wound, smited=TRUE) + type_wound = pick(list(/datum/wound/brute/cut/critical, /datum/wound/brute/cut/severe)) + slice_part.force_wound_upwards(type_wound, smited=TRUE) + if(ADMIN_PUNISHMENT_SCARIFY) + if(!iscarbon(target)) + to_chat(usr,"This must be used on a carbon mob.", confidential = TRUE) + return + var/mob/living/carbon/C = target + C.generate_fake_scars(rand(1, 4)) + to_chat(C, "You feel your body grow jaded and torn...") punish_log(target, punishment) /client/proc/punish_log(var/whom, var/punishment) diff --git a/code/modules/antagonists/blob/blob/blobstrains/blazing_oil.dm b/code/modules/antagonists/blob/blob/blobstrains/blazing_oil.dm index 97b974e28f..f97e271e72 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/blazing_oil.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/blazing_oil.dm @@ -36,6 +36,6 @@ M.adjust_fire_stacks(round(reac_volume/10)) M.IgniteMob() if(M) - M.apply_damage(0.8*reac_volume, BURN) + M.apply_damage(0.8*reac_volume, BURN, wound_bonus=CANT_WOUND) if(iscarbon(M)) M.emote("scream") diff --git a/code/modules/antagonists/blob/blob/blobstrains/cryogenic_poison.dm b/code/modules/antagonists/blob/blob/blobstrains/cryogenic_poison.dm index 9b8edcd0e5..f8ef269986 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/cryogenic_poison.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/cryogenic_poison.dm @@ -22,7 +22,7 @@ M.reagents.add_reagent("frostoil", 0.3*reac_volume) M.reagents.add_reagent("ice", 0.3*reac_volume) M.reagents.add_reagent("cryogenic_poison", 0.3*reac_volume) - M.apply_damage(0.2*reac_volume, BRUTE) + M.apply_damage(0.2*reac_volume, BRUTE, wound_bonus=CANT_WOUND) /datum/reagent/blob/cryogenic_poison/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(0.3*REAGENTS_EFFECT_MULTIPLIER, 0) diff --git a/code/modules/antagonists/blob/blob/blobstrains/electromagnetic_web.dm b/code/modules/antagonists/blob/blob/blobstrains/electromagnetic_web.dm index 0e665603c9..45bf2b1e1d 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/electromagnetic_web.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/electromagnetic_web.dm @@ -30,4 +30,4 @@ if(prob(reac_volume*2)) M.emp_act(EMP_LIGHT) if(M) - M.apply_damage(reac_volume, BURN) + M.apply_damage(reac_volume, BURN, wound_bonus=CANT_WOUND) diff --git a/code/modules/antagonists/blob/blob/blobstrains/explosive_lattice.dm b/code/modules/antagonists/blob/blob/blobstrains/explosive_lattice.dm index f8fd2e2f0d..3d005ba913 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/explosive_lattice.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/explosive_lattice.dm @@ -33,8 +33,8 @@ if(ROLE_BLOB in L.faction) //no friendly fire continue var/aoe_volume = ..(L, TOUCH, initial_volume, 0, L.get_permeability_protection(), O) - L.apply_damage(0.4*aoe_volume, BRUTE) + L.apply_damage(0.4*aoe_volume, BRUTE, wound_bonus=CANT_WOUND) if(M) - M.apply_damage(0.6*reac_volume, BRUTE) + M.apply_damage(0.6*reac_volume, BRUTE, wound_bonus=CANT_WOUND) else - M.apply_damage(0.6*reac_volume, BRUTE) + M.apply_damage(0.6*reac_volume, BRUTE, wound_bonus=CANT_WOUND) diff --git a/code/modules/antagonists/blob/blob/blobstrains/networked_fibers.dm b/code/modules/antagonists/blob/blob/blobstrains/networked_fibers.dm index fac3470c7a..8ccf2b9c99 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/networked_fibers.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/networked_fibers.dm @@ -33,6 +33,6 @@ /datum/reagent/blob/networked_fibers/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O) reac_volume = ..() - M.apply_damage(0.6*reac_volume, BRUTE) + M.apply_damage(0.6*reac_volume, BRUTE, wound_bonus=CANT_WOUND) if(M) - M.apply_damage(0.6*reac_volume, BURN) + M.apply_damage(0.6*reac_volume, BURN, wound_bonus=CANT_WOUND) diff --git a/code/modules/antagonists/blob/blob/blobstrains/pressurized_slime.dm b/code/modules/antagonists/blob/blob/blobstrains/pressurized_slime.dm index 6a984e66a2..11477712e7 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/pressurized_slime.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/pressurized_slime.dm @@ -44,7 +44,7 @@ T.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS) M.adjust_fire_stacks(-(reac_volume / 10)) M.ExtinguishMob() - M.apply_damage(0.4*reac_volume, BRUTE) + M.apply_damage(0.4*reac_volume, BRUTE, wound_bonus=CANT_WOUND) if(M) M.apply_damage(0.4*reac_volume, OXY) if(M) diff --git a/code/modules/antagonists/blob/blob/blobstrains/replicating_foam.dm b/code/modules/antagonists/blob/blob/blobstrains/replicating_foam.dm index 00743c671e..5565135c63 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/replicating_foam.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/replicating_foam.dm @@ -31,4 +31,4 @@ /datum/reagent/blob/replicating_foam/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O) reac_volume = ..() - M.apply_damage(0.7*reac_volume, BRUTE) + M.apply_damage(0.7*reac_volume, BRUTE, wound_bonus=CANT_WOUND) diff --git a/code/modules/antagonists/blob/blob/blobstrains/shifting_fragments.dm b/code/modules/antagonists/blob/blob/blobstrains/shifting_fragments.dm index dbb3d6fb9b..9265158e1b 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/shifting_fragments.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/shifting_fragments.dm @@ -32,4 +32,4 @@ /datum/reagent/blob/shifting_fragments/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O) reac_volume = ..() - M.apply_damage(0.7*reac_volume, BRUTE) + M.apply_damage(0.7*reac_volume, BRUTE, wound_bonus=CANT_WOUND) diff --git a/code/modules/antagonists/blob/blob/blobstrains/synchronous_mesh.dm b/code/modules/antagonists/blob/blob/blobstrains/synchronous_mesh.dm index d58fb5b37d..daad0068e2 100644 --- a/code/modules/antagonists/blob/blob/blobstrains/synchronous_mesh.dm +++ b/code/modules/antagonists/blob/blob/blobstrains/synchronous_mesh.dm @@ -30,9 +30,9 @@ /datum/reagent/blob/synchronous_mesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O) reac_volume = ..() - M.apply_damage(0.2*reac_volume, BRUTE) + M.apply_damage(0.2*reac_volume, BRUTE, wound_bonus=CANT_WOUND) if(M && reac_volume) for(var/obj/structure/blob/B in range(1, M)) //if the target is completely surrounded, this is 2.4*reac_volume bonus damage, total of 2.6*reac_volume if(M) B.blob_attack_animation(M) //show them they're getting a bad time - M.apply_damage(0.3*reac_volume, BRUTE) + M.apply_damage(0.3*reac_volume, BRUTE, wound_bonus=CANT_WOUND) diff --git a/code/modules/antagonists/changeling/powers/fleshmend.dm b/code/modules/antagonists/changeling/powers/fleshmend.dm index afef2a10c7..0299abb09a 100644 --- a/code/modules/antagonists/changeling/powers/fleshmend.dm +++ b/code/modules/antagonists/changeling/powers/fleshmend.dm @@ -1,6 +1,6 @@ /obj/effect/proc_holder/changeling/fleshmend name = "Fleshmend" - desc = "Our flesh rapidly regenerates, healing our burns, bruises, and shortness of breath. Functions while unconscious. This ability is loud, and might cause our blood to react violently to heat." + desc = "Our flesh rapidly regenerates, healing our burns, bruises, and shortness of breath, as well as hiding all of our scars. Costs 20 chemicals." helptext = "If we are on fire, the healing effect will not function. Does not regrow limbs or restore lost blood." chemical_cost = 20 loudness = 2 diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index e4417a6d64..7d50374e96 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -165,6 +165,8 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") sharpness = IS_SHARP + wound_bonus = -60 + bare_wound_bonus = 20 var/can_drop = FALSE var/fake = FALSE total_mass = TOTAL_MASS_HAND_REPLACEMENT diff --git a/code/modules/antagonists/changeling/powers/regenerate.dm b/code/modules/antagonists/changeling/powers/regenerate.dm index 1b27fa9694..bcebd8c62e 100644 --- a/code/modules/antagonists/changeling/powers/regenerate.dm +++ b/code/modules/antagonists/changeling/powers/regenerate.dm @@ -29,6 +29,9 @@ C.emote("scream") C.regenerate_limbs(1) C.regenerate_organs() + for(var/i in C.all_wounds) + var/datum/wound/W = i + W.remove_wound() if(!user.getorganslot(ORGAN_SLOT_BRAIN)) var/obj/item/organ/brain/B if(C.has_dna() && C.dna.species.mutant_brain) diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 5b2dd7d007..4e9d40d91c 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -34,6 +34,8 @@ w_class = WEIGHT_CLASS_SMALL force = 15 throwforce = 25 + wound_bonus = -30 + bare_wound_bonus = 30 armour_penetration = 35 actions_types = list(/datum/action/item_action/cult_dagger) @@ -53,8 +55,10 @@ flags_1 = CONDUCT_1 sharpness = IS_SHARP w_class = WEIGHT_CLASS_BULKY - force = 30 + force = 30 // whoever balanced this got beat in the head by a bible too many times good lord throwforce = 10 + wound_bonus = -80 + bare_wound_bonus = 30 hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended") diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index 6b063559dc..0c51c65a6f 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -34,8 +34,11 @@ healable = 0 environment_smash = ENVIRONMENT_SMASH_STRUCTURES obj_damage = 50 - melee_damage_lower = 30 - melee_damage_upper = 30 + melee_damage_lower = 15 // reduced from 30 to 15 with wounds since they get big buffs to slicing wounds + melee_damage_upper = 15 + wound_bonus = -10 + bare_wound_bonus = 0 + sharpness = TRUE see_in_dark = 8 blood_volume = 0 //No bleeding on getting shot, for skeddadles lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE @@ -43,13 +46,25 @@ var/playstyle_string = "You are a slaughter demon, a terrible creature from another realm. You have a single desire: To kill. \ You may use the \"Blood Crawl\" ability near blood pools to travel through them, appearing and disappearing from the station at will. \ Pulling a dead or unconscious mob while you enter a pool will pull them in with you, allowing you to feast and regain your health. \ - You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. " + You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. \ + You gain strength the more attacks you land on live humanoids, though this resets when you return to the blood zone. You can also \ + launch a devastating slam attack with ctrl+shift+click, capable of smashing bones in one strike.
" loot = list(/obj/effect/decal/cleanable/blood, \ /obj/effect/decal/cleanable/blood/innards, \ /obj/item/organ/heart/demon) del_on_death = 1 deathmessage = "screams in anger as it collapses into a puddle of viscera!" + // How long it takes for the alt-click slam attack to come off cooldown + var/slam_cooldown_time = 45 SECONDS + // The actual instance var for the cooldown + var/slam_cooldown = 0 + // How many times we have hit humanoid targets since we last bloodcrawled, scaling wounding power + var/current_hitstreak = 0 + // How much both our wound_bonus and bare_wound_bonus go up per hitstreak hit + var/wound_bonus_per_hit = 5 + // How much our wound_bonus hitstreak bonus caps at (peak demonry) + var/wound_bonus_hitstreak_max = 12 /mob/living/simple_animal/slaughter/Initialize() ..() @@ -58,6 +73,33 @@ if(istype(loc, /obj/effect/dummy/phased_mob/slaughter)) bloodspell.phased = TRUE +/mob/living/simple_animal/slaughter/CtrlShiftClickOn(atom/A) + if(!isliving(A)) + return ..() + if(slam_cooldown + slam_cooldown_time > world.time) + to_chat(src, "Your slam ability is still on cooldown!") + return + + face_atom(A) + var/mob/living/victim = A + victim.take_bodypart_damage(brute=20, wound_bonus=wound_bonus) // don't worry, there's more punishment when they hit something + visible_message("[src] slams into [victim] with monstrous strength!", "You slam into [victim] with monstrous strength!", ignored_mobs=victim) + to_chat(victim, "[src] slams into you with monstrous strength, sending you flying like a ragdoll!") + var/turf/yeet_target = get_edge_target_turf(victim, dir) + victim.throw_at(yeet_target, 10, 5, src) + slam_cooldown = world.time + log_combat(src, victim, "slaughter slammed") + +/mob/living/simple_animal/slaughter/UnarmedAttack(atom/A, proximity) + if(iscarbon(A)) + var/mob/living/carbon/target = A + if(target.stat != DEAD && target.mind && current_hitstreak < wound_bonus_hitstreak_max) + current_hitstreak++ + wound_bonus += wound_bonus_per_hit + bare_wound_bonus += wound_bonus_per_hit + + return ..() + /obj/effect/decal/cleanable/blood/innards icon = 'icons/obj/surgery.dmi' name = "pile of viscera" diff --git a/code/modules/antagonists/slaughter/slaughter_antag.dm b/code/modules/antagonists/slaughter/slaughter_antag.dm index 04f7167fa5..ddc4c1ebc3 100644 --- a/code/modules/antagonists/slaughter/slaughter_antag.dm +++ b/code/modules/antagonists/slaughter/slaughter_antag.dm @@ -14,6 +14,7 @@ /datum/antagonist/slaughter/greet() . = ..() owner.announce_objectives() + to_chat(owner, "You have a powerful alt-attack that slams people backwards that you can activate by shift+ctrl+clicking your target!") /datum/antagonist/slaughter/proc/forge_objectives() if(summoner) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 1f9e4ccac3..2e999dd9dc 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -33,6 +33,8 @@ var/escape_in_progress = FALSE var/message_cooldown var/breakout_time = 300 + ///Cryo will continue to treat people with 0 damage but existing wounds, but will sound off when damage healing is done in case doctors want to directly treat the wounds instead + var/treating_wounds = FALSE fair_market_price = 10 payment_department = ACCOUNT_MED @@ -174,15 +176,27 @@ return if(mob_occupant.health >= mob_occupant.getMaxHealth()) // Don't bother with fully healed people. - on = FALSE - update_icon() - playsound(src, 'sound/machines/cryo_warning.ogg', volume) // Bug the doctors. - var/msg = "Patient fully restored." - if(autoeject) // Eject if configured. - msg += " Auto ejecting patient now." - open_machine() - radio.talk_into(src, msg, radio_channel) - return + if(iscarbon(mob_occupant)) + var/mob/living/carbon/C = mob_occupant + if(C.all_wounds) + if(!treating_wounds) // if we have wounds and haven't already alerted the doctors we're only dealing with the wounds, let them know + treating_wounds = TRUE + playsound(src, 'sound/machines/cryo_warning.ogg', volume) // Bug the doctors. + var/msg = "Patient vitals fully recovered, continuing automated wound treatment." + radio.talk_into(src, msg, radio_channel) + else // otherwise if we were only treating wounds and now we don't have any, turn off treating_wounds so we can boot 'em out + treating_wounds = FALSE + + if(!treating_wounds) + on = FALSE + update_icon() + playsound(src, 'sound/machines/cryo_warning.ogg', volume) // Bug the doctors. + var/msg = "Patient fully restored." + if(autoeject) // Eject if configured. + msg += " Auto ejecting patient now." + open_machine() + radio.talk_into(src, msg, radio_channel) + return var/datum/gas_mixture/air1 = airs[1] diff --git a/code/modules/cargo/packs/goodies.dm b/code/modules/cargo/packs/goodies.dm index ac8b1e9032..2ff02d0473 100644 --- a/code/modules/cargo/packs/goodies.dm +++ b/code/modules/cargo/packs/goodies.dm @@ -75,3 +75,9 @@ desc = "The simple beach ball is one of Nanotrasen's most popular products. 'Why do we make beach balls? Because we can! (TM)' - Nanotrasen" cost = 200 contains = list(/obj/item/toy/beach_ball) + +/datum/supply_pack/goody/hell_single + name = "Hellgun Single-Pack" + desc = "Contains one hellgun, an old pattern of laser gun infamous for its ability to horribly disfigure targets with burns. Technically violates the Space Geneva Convention when used on humanoids." + cost = 1500 + contains = list(/obj/item/gun/energy/laser/hellgun) diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm index 2bb629308c..5eacc2f583 100644 --- a/code/modules/cargo/packs/medical.dm +++ b/code/modules/cargo/packs/medical.dm @@ -114,7 +114,9 @@ /obj/item/storage/box/medsprays, /obj/item/storage/box/syringes, /obj/item/storage/box/bodybags, - /obj/item/storage/pill_bottle/stimulant) + /obj/item/storage/pill_bottle/stimulant, + /obj/item/stack/medical/bone_gel, + /obj/item/stack/medical/bone_gel) crate_name = "medical supplies crate" /datum/supply_pack/medical/adv_surgery_tools diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 8b4c28a1f4..4278aea1d3 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -239,6 +239,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/autostand = TRUE var/auto_ooc = FALSE + /// If we have persistent scars enabled + var/persistent_scars = TRUE + /// We have 5 slots for persistent scars, if enabled we pick a random one to load (empty by default) and scars at the end of the shift if we survived as our original person + var/list/scars_list = list("1" = "", "2" = "", "3" = "", "4" = "", "5" = "") + /// Which of the 5 persistent scar slots we randomly roll to load for this round, if enabled. Actually rolled in [/datum/preferences/proc/load_character(slot)] + var/scars_index = 1 + /datum/preferences/New(client/C) parent = C @@ -825,6 +832,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Socks Color:    
Change
" dat += "Backpack:[backbag]" dat += "Jumpsuit:
[jumpsuit_style]
" + if(CAN_SCAR in pref_species.species_traits) + dat += "
Temporal Scarring:
[(persistent_scars) ? "Enabled" : "Disabled"]" + dat += "Clear scar slots" dat += "Uplink Location:[uplink_spawn_loc]" dat += "" @@ -2545,6 +2555,17 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("hear_midis") toggles ^= SOUND_MIDI + if("persistent_scars") + persistent_scars = !persistent_scars + + if("clear_scars") + to_chat(user, "All scar slots cleared. Please save character to confirm.") + scars_list["1"] = "" + scars_list["2"] = "" + scars_list["3"] = "" + scars_list["4"] = "" + scars_list["5"] = "" + if("lobby_music") toggles ^= SOUND_LOBBY if((toggles & SOUND_LOBBY) && user.client && isnewplayer(user)) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 440ee1fbc1..10881242e7 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -453,6 +453,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(newtype) pref_species = new newtype + + scars_index = rand(1,5) + //Character S["real_name"] >> real_name S["nameless"] >> nameless @@ -497,6 +500,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_insect_markings"] >> features["insect_markings"] S["feature_horns_color"] >> features["horns_color"] S["feature_wings_color"] >> features["wings_color"] + S["persistent_scars"] >> persistent_scars + S["scars1"] >> scars_list["1"] + S["scars2"] >> scars_list["2"] + S["scars3"] >> scars_list["3"] + S["scars4"] >> scars_list["4"] + S["scars5"] >> scars_list["5"] //Custom names @@ -709,6 +718,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["silicon_flavor_text"] = copytext(features["silicon_flavor_text"], 1, MAX_FLAVOR_LEN) features["ooc_notes"] = copytext(features["ooc_notes"], 1, MAX_FLAVOR_LEN) + persistent_scars = sanitize_integer(persistent_scars) + scars_list["1"] = sanitize_text(scars_list["1"]) + scars_list["2"] = sanitize_text(scars_list["2"]) + scars_list["3"] = sanitize_text(scars_list["3"]) + scars_list["4"] = sanitize_text(scars_list["4"]) + scars_list["5"] = sanitize_text(scars_list["5"]) + joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole)) //Validate job prefs for(var/j in job_preferences) @@ -840,6 +856,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["vore_taste"] , vore_taste) WRITE_FILE(S["belly_prefs"] , belly_prefs) + WRITE_FILE(S["persistent_scars"] , persistent_scars) + WRITE_FILE(S["scars1"] , scars_list["1"]) + WRITE_FILE(S["scars2"] , scars_list["2"]) + WRITE_FILE(S["scars3"] , scars_list["3"]) + WRITE_FILE(S["scars4"] , scars_list["4"]) + WRITE_FILE(S["scars5"] , scars_list["5"]) + //gear loadout if(chosen_gear.len) var/text_to_save = chosen_gear.Join("|") diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index a28061db10..e08886e71f 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -4,7 +4,7 @@ max_integrity = 200 integrity_failure = 0.4 block_priority = BLOCK_PRIORITY_CLOTHING - var/damaged_clothes = 0 //similar to machine's BROKEN stat and structure's broken var + var/damaged_clothes = CLOTHING_PRISTINE //similar to machine's BROKEN stat and structure's broken var var/flash_protect = 0 //What level of bright light protection item has. 1 = Flashers, Flashes, & Flashbangs | 2 = Welding | -1 = OH GOD WELDING BURNT OUT MY RETINAS var/tint = 0 //Sets the item's level of visual impairment tint, normally set to the same as flash_protect var/up = 0 //but separated to allow items to protect but not impair vision, like space helmets @@ -28,6 +28,9 @@ var/clothing_flags = NONE + // What items can be consumed to repair this clothing (must by an /obj/item/stack) + var/repairable_by = /obj/item/stack/sheet/cloth + //Var modification - PLEASE be careful with this I know who you are and where you live var/list/user_vars_to_edit //VARNAME = VARVALUE eg: "name" = "butts" var/list/user_vars_remembered //Auto built by the above + dropped() + equipped() @@ -45,7 +48,17 @@ var/list/species_restricted = null //Basically syntax is species_restricted = list("Species Name","Species Name") //Add a "exclude" string to do the opposite, making it only only species listed that can't wear it. - //You append this to clothing objects. + //You append this to clothing objects + + + + // How much clothing damage has been dealt to each of the limbs of the clothing, assuming it covers more than one limb + var/list/damage_by_parts + // How much integrity is in a specific limb before that limb is disabled (for use in [/obj/item/clothing/proc/take_damage_zone], and only if we cover multiple zones.) Set to 0 to disable shredding. + var/limb_integrity = 0 + // How many zones (body parts, not precise) we have disabled so far, for naming purposes + var/zones_disabled + . /obj/item/clothing/Initialize() . = ..() @@ -83,15 +96,105 @@ return ..() /obj/item/clothing/attackby(obj/item/W, mob/user, params) - if(damaged_clothes && istype(W, /obj/item/stack/sheet/cloth)) - var/obj/item/stack/sheet/cloth/C = W - C.use(1) - update_clothes_damaged_state(FALSE) - obj_integrity = max_integrity - to_chat(user, "You fix the damage on [src] with [C].") + if(damaged_clothes && istype(W, repairable_by)) + var/obj/item/stack/S = W + switch(damaged_clothes) + if(CLOTHING_DAMAGED) + S.use(1) + repair(user, params) + if(CLOTHING_SHREDDED) + if(S.amount < 3) + to_chat(user, "You require 3 [S.name] to repair [src].") + return + to_chat(user, "You begin fixing the damage to [src] with [S]...") + if(do_after(user, 6 SECONDS, TRUE, src)) + if(S.use(3)) + repair(user, params) return 1 return ..() +// Set the clothing's integrity back to 100%, remove all damage to bodyparts, and generally fix it up +/obj/item/clothing/proc/repair(mob/user, params) + damaged_clothes = CLOTHING_PRISTINE + update_clothes_damaged_state() + obj_integrity = max_integrity + name = initial(name) // remove "tattered" or "shredded" if there's a prefix + body_parts_covered = initial(body_parts_covered) + slot_flags = initial(slot_flags) + damage_by_parts = null + if(user) + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) + to_chat(user, "You fix the damage on [src].") + +/** + * take_damage_zone() is used for dealing damage to specific bodyparts on a worn piece of clothing, meant to be called from [/obj/item/bodypart/proc/check_woundings_mods()] + * + * This proc only matters when a bodypart that this clothing is covering is harmed by a direct attack (being on fire or in space need not apply), and only if this clothing covers + * more than one bodypart to begin with. No point in tracking damage by zone for a hat, and I'm not cruel enough to let you fully break them in a few shots. + * Also if limb_integrity is 0, then this clothing doesn't have bodypart damage enabled so skip it. + * + * Arguments: + * * def_zone: The bodypart zone in question + * * damage_amount: Incoming damage + * * damage_type: BRUTE or BURN + * * armour_penetration: If the attack had armour_penetration + */ +/obj/item/clothing/proc/take_damage_zone(def_zone, damage_amount, damage_type, armour_penetration) + if(!def_zone || !limb_integrity || (initial(body_parts_covered) in GLOB.bitflags)) // the second check sees if we only cover one bodypart anyway and don't need to bother with this + return + var/list/covered_limbs = body_parts_covered2organ_names(body_parts_covered) // what do we actually cover? + if(!(def_zone in covered_limbs)) + return + + var/damage_dealt = take_damage(damage_amount * 0.1, damage_type, armour_penetration, FALSE) * 10 // only deal 10% of the damage to the general integrity damage, then multiply it by 10 so we know how much to deal to limb + LAZYINITLIST(damage_by_parts) + damage_by_parts[def_zone] += damage_dealt + if(damage_by_parts[def_zone] > limb_integrity) + disable_zone(def_zone, damage_type) + +/** + * disable_zone() is used to disable a given bodypart's protection on our clothing item, mainly from [/obj/item/clothing/proc/take_damage_zone()] + * + * This proc disables all protection on the specified bodypart for this piece of clothing: it'll be as if it doesn't cover it at all anymore (because it won't!) + * If every possible bodypart has been disabled on the clothing, we put it out of commission entirely and mark it as shredded, whereby it will have to be repaired in + * order to equip it again. Also note we only consider it damaged if there's more than one bodypart disabled. + * + * Arguments: + * * def_zone: The bodypart zone we're disabling + * * damage_type: Only really relevant for the verb for describing the breaking, and maybe obj_destruction() + */ +/obj/item/clothing/proc/disable_zone(def_zone, damage_type) + var/list/covered_limbs = body_parts_covered2organ_names(body_parts_covered) + if(!(def_zone in covered_limbs)) + return + + var/zone_name = parse_zone(def_zone) + var/break_verb = ((damage_type == BRUTE) ? "torn" : "burned") + + if(iscarbon(loc)) + var/mob/living/carbon/C = loc + C.visible_message("The [zone_name] on [C]'s [src.name] is [break_verb] away!", "The [zone_name] on your [src.name] is [break_verb] away!", vision_distance = COMBAT_MESSAGE_RANGE) + RegisterSignal(C, COMSIG_MOVABLE_MOVED, .proc/bristle) + + zones_disabled++ + for(var/i in zone2body_parts_covered(def_zone)) + body_parts_covered &= ~i + + if(body_parts_covered == NONE) // if there are no more parts to break then the whole thing is kaput + obj_destruction((damage_type == BRUTE ? "melee" : "laser")) // melee/laser is good enough since this only procs from direct attacks anyway and not from fire/bombs + return + + damaged_clothes = CLOTHING_DAMAGED + switch(zones_disabled) + if(1) + name = "damaged [initial(name)]" + if(2) + name = "mangy [initial(name)]" + if(3 to INFINITY) // take better care of your shit, dude + name = "tattered [initial(name)]" + + update_clothes_damaged_state() + /obj/item/clothing/Destroy() user_vars_remembered = null //Oh god somebody put REFERENCES in here? not to worry, we'll clean it up return ..() @@ -100,6 +203,7 @@ ..() if(!istype(user)) return + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) if(LAZYLEN(user_vars_remembered)) for(var/variable in user_vars_remembered) if(variable in user.vars) @@ -112,7 +216,9 @@ if (!istype(user)) return if(slot_flags & slotdefine2slotbit(slot)) //Was equipped to a valid slot for this item? - if (LAZYLEN(user_vars_to_edit)) + if(iscarbon(user) && LAZYLEN(zones_disabled)) + RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/bristle) + if(LAZYLEN(user_vars_to_edit)) for(var/variable in user_vars_to_edit) if(variable in user.vars) LAZYSET(user_vars_remembered, variable, user.vars[variable]) @@ -120,8 +226,19 @@ /obj/item/clothing/examine(mob/user) . = ..() - if(damaged_clothes) - . += "It looks damaged!" + if(damaged_clothes == CLOTHING_SHREDDED) + . += "It is completely shredded and requires mending before it can be worn again!" + return + for(var/zone in damage_by_parts) + var/pct_damage_part = damage_by_parts[zone] / limb_integrity * 100 + var/zone_name = parse_zone(zone) + switch(pct_damage_part) + if(100 to INFINITY) + . += "The [zone_name] is useless and requires mending!" + if(60 to 99) + . += "The [zone_name] is heavily shredded!" + if(30 to 59) + . += "The [zone_name] is partially shredded." var/datum/component/storage/pockets = GetComponent(/datum/component/storage) if(pockets) var/list/how_cool_are_your_threads = list("") @@ -139,8 +256,8 @@ . += how_cool_are_your_threads.Join() /obj/item/clothing/obj_break(damage_flag) - if(!damaged_clothes) - update_clothes_damaged_state(TRUE) + damaged_clothes = CLOTHING_DAMAGED + update_clothes_damaged_state() if(ismob(loc)) //It's not important enough to warrant a message if nobody's wearing it var/mob/M = loc to_chat(M, "Your [name] starts to fall apart!") @@ -222,16 +339,25 @@ BLIND // can't see anything /obj/item/clothing/obj_destruction(damage_flag) - if(damage_flag == "bomb" || damage_flag == "melee") + if(damage_flag == "bomb") var/turf/T = get_turf(src) spawn(1) //so the shred survives potential turf change from the explosion. var/obj/effect/decal/cleanable/shreds/Shreds = new(T) Shreds.desc = "The sad remains of what used to be [name]." deconstruct(FALSE) + else if(!(damage_flag in list("acid", "fire"))) + damaged_clothes = CLOTHING_SHREDDED + body_parts_covered = NONE + name = "shredded [initial(name)]" + slot_flags = NONE + update_clothes_damaged_state() + if(ismob(loc)) + var/mob/M = loc + M.visible_message("[M]'s [src.name] falls off, completely shredded!", "Your [src.name] falls off, completely shredded!", vision_distance = COMBAT_MESSAGE_RANGE) + M.dropItemToGround(src) else ..() - //Species-restricted clothing check. - Thanks Oraclestation, BS13, /vg/station etc. /obj/item/clothing/mob_can_equip(mob/M, slot, disable_warning = TRUE) @@ -265,3 +391,12 @@ BLIND // can't see anything return FALSE return TRUE + + + +/// If we're a clothing with at least 1 shredded/disabled zone, give the wearer a periodic heads up letting them know their clothes are damaged +/obj/item/clothing/proc/bristle(mob/living/L) + if(!istype(L)) + return + if(prob(0.2)) + to_chat(L, "The damaged threads on your [src.name] chafe!") diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index ddf5e4b584..a206b9adc7 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -34,7 +34,7 @@ if(blood_DNA) . += mutable_appearance('icons/effects/blood.dmi', "bloodyhands", color = blood_DNA_to_color()) -/obj/item/clothing/gloves/update_clothes_damaged_state(damaging = TRUE) +/obj/item/clothing/gloves/update_clothes_damaged_state() ..() if(ismob(loc)) var/mob/M = loc diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 475e7a4e51..9682787de5 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -56,7 +56,7 @@ if(blood_DNA) . += mutable_appearance('icons/effects/blood.dmi', "helmetblood", color = blood_DNA_to_color()) -/obj/item/clothing/head/update_clothes_damaged_state(damaging = TRUE) +/obj/item/clothing/head/update_clothes_damaged_state() ..() if(ismob(loc)) var/mob/M = loc diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index 7df38661e5..7a5a031e79 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -37,7 +37,7 @@ if(blood_DNA) . += mutable_appearance('icons/effects/blood.dmi', "maskblood", color = blood_DNA_to_color()) -/obj/item/clothing/mask/update_clothes_damaged_state(damaging = TRUE) +/obj/item/clothing/mask/update_clothes_damaged_state() ..() if(ismob(loc)) var/mob/M = loc diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 447a531717..d67aea11a1 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -85,7 +85,7 @@ restore_offsets(user) . = ..() -/obj/item/clothing/shoes/update_clothes_damaged_state(damaging = TRUE) +/obj/item/clothing/shoes/update_clothes_damaged_state() ..() if(ismob(loc)) var/mob/M = loc diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index 8de49c63de..0d16f9bdfa 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -10,6 +10,7 @@ var/blood_overlay_type = "suit" var/togglename = null var/suittoggled = FALSE + limb_integrity = 0 // disabled for most exo-suits mutantrace_variation = STYLE_DIGITIGRADE /obj/item/clothing/suit/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) @@ -28,7 +29,7 @@ if(A.above_suit) . += U.accessory_overlay -/obj/item/clothing/suit/update_clothes_damaged_state(damaging = TRUE) +/obj/item/clothing/suit/update_clothes_damaged_state() ..() if(ismob(loc)) var/mob/M = loc diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 0ef1a83bf5..1c753b15df 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -8,7 +8,8 @@ equip_delay_other = 40 max_integrity = 250 resistance_flags = NONE - armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 15) + /obj/item/clothing/suit/armor/Initialize() . = ..() @@ -57,7 +58,7 @@ icon_state = "hos" item_state = "greatcoat" body_parts_covered = CHEST|GROIN|ARMS|LEGS - armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90) + armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90, "wound" = 20) cold_protection = CHEST|GROIN|LEGS|ARMS heat_protection = CHEST|GROIN|LEGS|ARMS strip_delay = 80 @@ -123,7 +124,7 @@ icon_state = "capcarapace" item_state = "armor" body_parts_covered = CHEST|GROIN - armor = list("melee" = 50, "bullet" = 40, "laser" = 50, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 90) + armor = list("melee" = 50, "bullet" = 40, "laser" = 50, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 90, "wound" = 10) dog_fashion = null resistance_flags = FIRE_PROOF @@ -147,7 +148,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) + armor = list("melee" = 50, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80, "wound" = 30) blocks_shove_knockdown = TRUE strip_delay = 80 equip_delay_other = 60 @@ -158,7 +159,7 @@ icon_state = "bonearmor" item_state = "bonearmor" blood_overlay_type = "armor" - armor = list("melee" = 35, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 35, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 10) body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS /obj/item/clothing/suit/armor/bulletproof @@ -167,7 +168,7 @@ icon_state = "bulletproof" item_state = "armor" blood_overlay_type = "armor" - armor = list("melee" = 15, "bullet" = 60, "laser" = 10, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 15, "bullet" = 60, "laser" = 10, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50 "wound" = 20) strip_delay = 70 equip_delay_other = 50 mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON @@ -285,7 +286,7 @@ desc = "A classic suit of armour, able to be made from many different materials." icon_state = "knight_greyscale" item_state = "knight_greyscale" - armor = list("melee" = 35, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 10, "rad" = 10, "fire" = 40, "acid" = 40) + armor = list("melee" = 35, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 10, "rad" = 10, "fire" = 40, "acid" = 40, "wound" = 15) material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Can change color and add prefix /obj/item/clothing/suit/armor/vest/durathread @@ -304,7 +305,7 @@ desc = "A bulletproof vest with forest camo. Good thing there's plenty of forests to hide in around here, right?" icon_state = "rus_armor" item_state = "rus_armor" - armor = list("melee" = 25, "bullet" = 30, "laser" = 0, "energy" = 15, "bomb" = 10, "bio" = 0, "rad" = 20, "fire" = 20, "acid" = 50) + armor = list("melee" = 25, "bullet" = 30, "laser" = 0, "energy" = 15, "bomb" = 10, "bio" = 0, "rad" = 20, "fire" = 20, "acid" = 50, "wound" = 10) /obj/item/clothing/suit/armor/vest/russian_coat name = "russian battle coat" @@ -315,4 +316,4 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - armor = list("melee" = 25, "bullet" = 20, "laser" = 20, "energy" = 10, "bomb" = 20, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 50) + armor = list("melee" = 25, "bullet" = 20, "laser" = 20, "energy" = 10, "bomb" = 20, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 50, "wound" = 10) diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 047dc7b7a3..fc783936da 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -73,7 +73,7 @@ gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 body_parts_covered = CHEST|GROIN|ARMS|LEGS - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100) + armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100, "wound" = 20) allowed = list(/obj/item/teleportation_scroll) flags_inv = HIDEJUMPSUIT strip_delay = 50 diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index e0ecf24204..23cb2b1c15 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -5,8 +5,9 @@ permeability_coefficient = 0.9 block_priority = BLOCK_PRIORITY_UNIFORM slot_flags = ITEM_SLOT_ICLOTHING - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) mutantrace_variation = STYLE_DIGITIGRADE|USE_TAUR_CLIP_MASK + limb_integrity = 30 var/fitted = FEMALE_UNIFORM_FULL // For use in alternate clothing styles for women var/has_sensor = HAS_SENSORS // For the crew computer var/random_sensor = TRUE @@ -39,7 +40,7 @@ if(!attach_accessory(I, user)) return ..() -/obj/item/clothing/under/update_clothes_damaged_state(damaging = TRUE) +/obj/item/clothing/under/update_clothes_damaged_state() ..() if(ismob(loc)) var/mob/M = loc diff --git a/code/modules/clothing/under/jobs/cargo.dm b/code/modules/clothing/under/jobs/cargo.dm index aa4db2fd30..8fbc343598 100644 --- a/code/modules/clothing/under/jobs/cargo.dm +++ b/code/modules/clothing/under/jobs/cargo.dm @@ -34,8 +34,9 @@ mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/cargo/miner - desc = "It's a snappy jumpsuit with a sturdy set of overalls. It is very dirty." name = "shaft miner's jumpsuit" + desc = "It's a snappy jumpsuit with a sturdy set of overalls. It is very dirty." + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 0, "wound" = 10) icon_state = "miner" item_state = "miner" diff --git a/code/modules/clothing/under/jobs/command.dm b/code/modules/clothing/under/jobs/command.dm index 1bc0f64373..8272c36cf3 100644 --- a/code/modules/clothing/under/jobs/command.dm +++ b/code/modules/clothing/under/jobs/command.dm @@ -19,6 +19,7 @@ /obj/item/clothing/under/rank/captain/suit name = "captain's suit" desc = "A green suit and yellow necktie. Exemplifies authority." + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 15) icon_state = "green_suit" item_state = "dg_suit" can_adjust = FALSE diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 26fff7c8ed..7747d2e181 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -19,7 +19,7 @@ desc = "A tactical security jumpsuit for officers complete with Nanotrasen belt buckle." icon_state = "rsecurity" item_state = "r_suit" - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30, "wound" = 10) /obj/item/clothing/under/rank/security/officer/grey name = "grey security jumpsuit" @@ -67,7 +67,7 @@ desc = "A formal security suit for officers complete with Nanotrasen belt buckle." icon_state = "rwarden" item_state = "r_suit" - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30, "wound" = 10) /obj/item/clothing/under/rank/security/warden/grey name = "grey security suit" @@ -101,7 +101,7 @@ desc = "Someone who wears this means business." icon_state = "detective" item_state = "det" - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 30, "wound" = 10) /obj/item/clothing/under/rank/security/detective/skirt name = "detective's suitskirt" @@ -138,7 +138,7 @@ desc = "A security jumpsuit decorated for those few with the dedication to achieve the position of Head of Security." icon_state = "rhos" item_state = "r_suit" - armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 10) strip_delay = 60 /obj/item/clothing/under/rank/security/head_of_security/skirt diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index 3455a97ba2..93c733391e 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -313,6 +313,8 @@ h1.alert, h2.alert {color: #000000;} .rose {color: #ff5050;} .info {color: #0000CC;} .notice {color: #000099;} +.tinynotice {color: #6685f5; font-style: italic; font-size: 85%;} +.smallnotice {color: #6685f5; font-style: italic; font-size: 90%;} .boldnotice {color: #000099; font-weight: bold;} .adminnotice {color: #0000ff;} .adminhelp {color: #ff0000; font-weight: bold;} diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index 0979ea483f..cee7748c59 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -90,6 +90,7 @@ icon_state = "deathnettle" force = 30 throwforce = 15 + wound_bonus = CANT_WOUND /obj/item/reagent_containers/food/snacks/grown/nettle/death/add_juice() ..() diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index adee2856fa..9cbc15ca28 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -45,7 +45,7 @@ shoes = /obj/item/clothing/shoes/sneakers/brown suit = /obj/item/clothing/suit/toggle/labcoat/cmo l_hand = /obj/item/storage/firstaid/regular - suit_store = /obj/item/flashlight/pen + suit_store = /obj/item/flashlight/pen/paramedic backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1) backpack = /obj/item/storage/backpack/medic diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index 9bdfdfe279..c8188cae8a 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -36,7 +36,7 @@ suit = /obj/item/clothing/suit/toggle/labcoat/paramedic belt = /obj/item/storage/belt/medical l_hand = /obj/item/storage/firstaid/regular - suit_store = /obj/item/flashlight/pen + suit_store = /obj/item/flashlight/pen/paramedic id = /obj/item/card/id r_pocket = /obj/item/pinpointer/crew l_pocket = /obj/item/pda/medical diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index 39f8e296af..09562a2a52 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -26,7 +26,7 @@ cold_protection = HEAD max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT heat_protection = HEAD - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) + armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50, "wound" = 10) resistance_flags = FIRE_PROOF /obj/item/clothing/suit/hooded/explorer/standard @@ -50,7 +50,7 @@ visor_flags_inv = HIDEFACIALHAIR visor_flags_cover = MASKCOVERSMOUTH actions_types = list(/datum/action/item_action/adjust) - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 50, "rad" = 0, "fire" = 20, "acid" = 40) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 50, "rad" = 0, "fire" = 20, "acid" = 40, "wound" = 5) resistance_flags = FIRE_PROOF /obj/item/clothing/mask/gas/explorer/attack_self(mob/user) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index d3892cc282..323df097b2 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -558,12 +558,25 @@ client.prefs.random_character() client.prefs.real_name = client.prefs.pref_species.random_name(gender,1) client.prefs.copy_to(H) + var/cur_scar_index = client.prefs.scars_index + if(client.prefs.persistent_scars && client.prefs.scars_list["[cur_scar_index]"]) + var/scar_string = client.prefs.scars_list["[cur_scar_index]"] + var/valid_scars = "" + for(var/scar_line in splittext(scar_string, ";")) + if(H.load_scar(scar_line)) + valid_scars += "[scar_line];" + + client.prefs.scars_list["[cur_scar_index]"] = valid_scars + client.prefs.save_character() + + client.prefs.copy_to(H, antagonist = is_antag) H.dna.update_dna_identity() if(mind) if(transfer_after) mind.late_joiner = TRUE mind.active = 0 //we wish to transfer the key manually mind.transfer_to(H) //won't transfer key since the mind is not active + mind.original_character = H H.name = real_name diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 8ca4e6a0e4..ee0b58f766 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -5,12 +5,27 @@ #define EXOTIC_BLEED_MULTIPLIER 4 //Multiplies the actually bled amount by this number for the purposes of turf reaction calculations. -/mob/living/carbon/human/proc/suppress_bloodloss(amount) - if(bleedsuppress) - return - else - bleedsuppress = TRUE - addtimer(CALLBACK(src, .proc/resume_bleeding), amount) +/mob/living/carbon/monkey/handle_blood() + if(bodytemperature <= TCRYO || (HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood. + var/temp_bleed = 0 + for(var/X in bodyparts) + var/obj/item/bodypart/BP = X + temp_bleed += BP.get_bleed_rate() + BP.generic_bleedstacks = max(0, BP.generic_bleedstacks - 1) + bleed(temp_bleed) + + var/temp_bleed = 0 + for(var/X in bodyparts) + var/obj/item/bodypart/BP = X + temp_bleed += BP.get_bleed_rate() + BP.generic_bleedstacks = max(0, BP.generic_bleedstacks - 1) + bleed(temp_bleed) + + //Blood regeneration if there is some space + if(blood_volume < BLOOD_VOLUME_NORMAL) + blood_volume += 0.1 // regenerate blood VERY slowly + if(blood_volume < BLOOD_VOLUME_OKAY) + adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1)) /mob/living/carbon/human/proc/resume_bleeding() bleedsuppress = 0 @@ -29,8 +44,7 @@ // Takes care blood loss and regeneration /mob/living/carbon/human/handle_blood() - if(NOBLOOD in dna.species.species_traits) - bleed_rate = 0 + if(NOBLOOD in dna.species.species_traits || bleedsuppress || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) return if(bleed_rate < 0) @@ -87,24 +101,11 @@ //Bleeding out for(var/X in bodyparts) var/obj/item/bodypart/BP = X - var/brutedamage = BP.brute_dam + temp_bleed += BP.get_bleed_rate() + BP.generic_bleedstacks = max(0, BP.generic_bleedstacks - 1) - if(BP.status == BODYPART_ROBOTIC) //for the moment, synth limbs won't bleed, but soon, my pretty. - continue - - //We want an accurate reading of .len - listclearnulls(BP.embedded_objects) - for(var/obj/item/embeddies in BP.embedded_objects) - if(!embeddies.isEmbedHarmless()) - temp_bleed += 0.5 - - if(brutedamage >= 20) - temp_bleed += (brutedamage * 0.013) - - bleed_rate = max(bleed_rate - 0.5, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases - - if(bleed_rate && !bleedsuppress && !(HAS_TRAIT(src, TRAIT_FAKEDEATH))) - bleed(bleed_rate) + if(temp_bleed) + bleed(temp_bleed) //Makes a blood drop, leaking amt units of blood from the mob /mob/living/carbon/proc/bleed(amt) @@ -128,9 +129,11 @@ /mob/living/proc/restore_blood() blood_volume = initial(blood_volume) -/mob/living/carbon/human/restore_blood() +/mob/living/carbon/restore_blood() blood_volume = (BLOOD_VOLUME_NORMAL * blood_ratio) - bleed_rate = 0 + for(var/i in bodyparts) + var/obj/item/bodypart/BP = i + BP.generic_bleedstacks = 0 /**************************************************** BLOOD TRANSFERS diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 4fda02317e..b6f8dd349b 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -331,6 +331,8 @@ max_traumas = TRAUMA_LIMIT_BASIC if(TRAUMA_RESILIENCE_SURGERY) max_traumas = TRAUMA_LIMIT_SURGERY + if(TRAUMA_RESILIENCE_WOUND) + max_traumas = TRAUMA_LIMIT_WOUND if(TRAUMA_RESILIENCE_LOBOTOMY) max_traumas = TRAUMA_LIMIT_LOBOTOMY if(TRAUMA_RESILIENCE_MAGIC) @@ -389,7 +391,7 @@ return var/trauma_type = pick(possible_traumas) - gain_trauma(trauma_type, resilience) + return gain_trauma(trauma_type, resilience) //Cure a random trauma of a certain resilience level /obj/item/organ/brain/proc/cure_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_BASIC) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 8472c8bdae..c8c5bba9f9 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -88,11 +88,32 @@ for(var/datum/surgery/S in surgeries) if(S.next_step(user,user.a_intent)) return 1 + + if(!all_wounds || !(user.a_intent == INTENT_HELP || user == src)) + return ..() + + // The following priority/nonpriority searching is so that if we have two wounds on a limb that use the same item for treatment (gauze can bandage cuts AND splint broken bones), + // we prefer whichever wound is not already treated (ignore the splinted broken bone for the open cut). If there's no priority wounds that this can treat, go through the + // non-priority ones randomly. + var/list/nonpriority_wounds = list() + for(var/datum/wound/W in shuffle(all_wounds)) + if(!W.treat_priority) + nonpriority_wounds += W + else if(W.treat_priority && W.try_treating(I, user)) + return 1 + + for(var/datum/wound/W in shuffle(nonpriority_wounds)) + if(W.try_treating(I, user)) + return 1 + return ..() /mob/living/carbon/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() var/hurt = TRUE + var/extra_speed = 0 + if(throwingdatum.thrower != src) + extra_speed = min(max(0, throwingdatum.speed - initial(throw_speed)), 3) if(GetComponent(/datum/component/tackler)) return if(throwingdatum?.thrower && iscyborg(throwingdatum.thrower)) @@ -102,18 +123,18 @@ if(hit_atom.density && isturf(hit_atom)) if(hurt) DefaultCombatKnockdown(20) - take_bodypart_damage(10) + take_bodypart_damage(10 + 5 * extra_speed, check_armor = TRUE, wound_bonus = extra_speed) if(iscarbon(hit_atom) && hit_atom != src) var/mob/living/carbon/victim = hit_atom if(victim.movement_type & FLYING) return if(hurt) - victim.take_bodypart_damage(10) - take_bodypart_damage(10) + victim.take_bodypart_damage(10 + 5 * extra_speed, check_armor = TRUE, wound_bonus = extra_speed * 5) + take_bodypart_damage(10 + 5 * extra_speed, check_armor = TRUE, wound_bonus = extra_speed * 5) victim.DefaultCombatKnockdown(20) DefaultCombatKnockdown(20) - visible_message("[src] crashes into [victim], knocking them both over!",\ - "You violently crash into [victim]!") + visible_message("[src] crashes into [victim] [extra_speed ? "really hard" : ""], knocking them both over!",\ + "You violently crash into [victim] [extra_speed ? "extra hard" : ""]!") playsound(src,'sound/weapons/punch1.ogg',50,1) @@ -196,12 +217,18 @@ adjustStaminaLossBuffered(I.getweight(src, STAM_COST_THROW_MULT, SKILL_THROW_STAM_COST)) if(thrown_thing) - visible_message("[src] has thrown [thrown_thing].") - log_message("has thrown [thrown_thing]", LOG_ATTACK) + var/power_throw = 0 + if(HAS_TRAIT(src, TRAIT_HULK)) + power_throw++ + if(pulling && grab_state >= GRAB_NECK) + power_throw++ + visible_message("[src] throws [thrown_thing][power_throw ? " really hard!" : "."]", \ + "You throw [thrown_thing][power_throw ? " really hard!" : "."]") + log_message("has thrown [thrown_thing] [power_throw ? "really hard" : ""]", LOG_ATTACK) do_attack_animation(target, no_effect = 1) playsound(loc, 'sound/weapons/punchmiss.ogg', 50, 1, -1) newtonian_move(get_dir(target, src)) - thrown_thing.safe_throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src, null, null, null, move_force, random_turn) + thrown_thing.safe_throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed + power_throw, src, null, null, null, move_force) /mob/living/carbon/restrained(ignore_grab) . = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE)) @@ -892,6 +919,9 @@ var/datum/disease/D = thing if(D.severity != DISEASE_SEVERITY_POSITIVE) D.cure(FALSE) + for(var/thing in all_wounds) + var/datum/wound/W = thing + W.remove_wound() if(admin_revive) regenerate_limbs() regenerate_organs() @@ -982,6 +1012,10 @@ if(SANITY_NEUTRAL to SANITY_GREAT) . *= 0.90 + for(var/i in status_effects) + var/datum/status_effect/S = i + . *= S.interact_speed_modifier() + /mob/living/carbon/proc/create_internal_organs() for(var/X in internal_organs) @@ -1170,3 +1204,47 @@ if(wear_mask) if(wear_mask.flags_inv & HIDEEYES) LAZYOR(., SLOT_GLASSES) + +// if any of our bodyparts are bleeding +/mob/living/carbon/proc/is_bleeding() + for(var/i in bodyparts) + var/obj/item/bodypart/BP = i + if(BP.get_bleed_rate()) + return TRUE + +// get our total bleedrate +/mob/living/carbon/proc/get_total_bleed_rate() + var/total_bleed_rate = 0 + for(var/i in bodyparts) + var/obj/item/bodypart/BP = i + total_bleed_rate += BP.get_bleed_rate() + + return total_bleed_rate + +/** + * generate_fake_scars()- for when you want to scar someone, but you don't want to hurt them first. These scars don't count for temporal scarring (hence, fake) + * + * If you want a specific wound scar, pass that wound type as the second arg, otherwise you can pass a list like WOUND_LIST_CUT to generate a random cut scar. + * + * Arguments: + * * num_scars- A number for how many scars you want to add + * * forced_type- Which wound or category of wounds you want to choose from, WOUND_LIST_BONE, WOUND_LIST_CUT, or WOUND_LIST_BURN (or some combination). If passed a list, picks randomly from the listed wounds. Defaults to all 3 types + */ +/mob/living/carbon/proc/generate_fake_scars(num_scars, forced_type) + for(var/i in 1 to num_scars) + var/datum/scar/S = new + var/obj/item/bodypart/BP = pick(bodyparts) + + var/wound_type + if(forced_type) + if(islist(forced_type)) + wound_type = pick(forced_type) + else + wound_type = forced_type + else + wound_type = pick(WOUND_LIST_BONE + WOUND_LIST_CUT + WOUND_LIST_BURN) + + var/datum/wound/W = new wound_type + S.generate(BP, W) + S.fake = TRUE + QDEL_NULL(W) From 93b4570f8d4b6888d4a2a12d35b333c2cbcd7c8c Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Fri, 17 Jul 2020 23:23:47 +0100 Subject: [PATCH 034/122] more changes --- code/game/atoms.dm | 6 +++-- code/game/objects/items/devices/scanners.dm | 8 ++++-- code/modules/clothing/suits/wiz_robe.dm | 2 +- .../modules/mining/equipment/explorer_gear.dm | 6 +---- code/modules/mob/living/carbon/carbon.dm | 2 +- .../simple_animal/hostile/megafauna/drake.dm | 9 +++++-- .../nanites/nanite_programs/utility.dm | 4 ++- code/modules/surgery/tools.dm | 18 +++++++++++++ code/modules/vending/_vending.dm | 27 ++++++++++++++----- code/modules/vending/medical.dm | 7 ++++- code/modules/vending/medical_wall.dm | 2 ++ code/modules/zombie/items.dm | 3 +++ 12 files changed, 73 insertions(+), 21 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index fd922729ab..9cf334e5f3 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -997,13 +997,15 @@ Proc for attack log creation, because really why not * * base_roll- Base wounding ability of an attack is a random number from 1 to (dealt_damage ** WOUND_DAMAGE_EXPONENT). This is the number that was rolled in there, before mods */ /proc/log_wound(atom/victim, datum/wound/suffered_wound, dealt_damage, dealt_wound_bonus, dealt_bare_wound_bonus, base_roll) - var/message = "has suffered: [suffered_wound] to [suffered_wound.limb.name]" // maybe indicate if it's a promote/demote? + if(QDELETED(victim) || !suffered_wound) + return + var/message = "has suffered: [suffered_wound][suffered_wound.limb ? " to [suffered_wound.limb.name]" : null]"// maybe indicate if it's a promote/demote? if(dealt_damage) message += " | Damage: [dealt_damage]" // The base roll is useful since it can show how lucky someone got with the given attack. For example, dealing a cut if(base_roll) - message += "(rolled [base_roll]/[dealt_damage ** WOUND_DAMAGE_EXPONENT])" + message += " (rolled [base_roll]/[dealt_damage ** WOUND_DAMAGE_EXPONENT])" if(dealt_wound_bonus) message += " | WB: [dealt_wound_bonus]" diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 5f86320830..2011943bfb 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -542,8 +542,12 @@ GENETICS SCANNER render_list += "" if(render_list == "") - playsound(scanner, 'sound/machines/ping.ogg', 50, FALSE) - to_chat(user, "\The [scanner] makes a happy ping and briefly displays a smiley face with several exclamation points! It's really excited to report that [patient] has no wounds!") + if(istype(scanner)) + // Only emit the cheerful scanner message if this scan came from a scanner + playsound(scanner, 'sound/machines/ping.ogg', 50, FALSE) + to_chat(user, "\The [scanner] makes a happy ping and briefly displays a smiley face with several exclamation points! It's really excited to report that [patient] has no wounds!") + else + to_chat(user, "No wounds detected in subject.") else to_chat(user, jointext(render_list, "")) diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index fc783936da..94273d2c73 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -4,7 +4,7 @@ icon_state = "wizard" gas_transfer_coefficient = 0.01 // IT'S MAGICAL OKAY JEEZ +1 TO NOT DIE permeability_coefficient = 0.01 - armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100) + armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100, "wound" = 20) strip_delay = 50 equip_delay_other = 50 resistance_flags = FIRE_PROOF | ACID_PROOF diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index 09562a2a52..cda38033c2 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -5,10 +5,8 @@ icon_state = "explorer" item_state = "explorer" body_parts_covered = CHEST|GROIN|LEGS|ARMS - min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT cold_protection = CHEST|GROIN|LEGS|ARMS - max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - heat_protection = CHEST|GROIN|LEGS|ARMS + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT hoodtype = /obj/item/clothing/head/hooded/explorer armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) flags_inv = HIDEJUMPSUIT|HIDETAUR @@ -24,8 +22,6 @@ flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT cold_protection = HEAD - max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT - heat_protection = HEAD armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50, "wound" = 10) resistance_flags = FIRE_PROOF diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index c8c5bba9f9..62c78fe007 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -123,7 +123,7 @@ if(hit_atom.density && isturf(hit_atom)) if(hurt) DefaultCombatKnockdown(20) - take_bodypart_damage(10 + 5 * extra_speed, check_armor = TRUE, wound_bonus = extra_speed) + take_bodypart_damage(10 + 5 * extra_speed, check_armor = TRUE, wound_bonus = extra_speed * 5) if(iscarbon(hit_atom) && hit_atom != src) var/mob/living/carbon/victim = hit_atom if(victim.movement_type & FLYING) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 062a4c9a43..a1ecde40b8 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -4,6 +4,11 @@ #define SWOOP_DAMAGEABLE 1 #define SWOOP_INVULNERABLE 2 +///used whenever the drake generates a hotspot +#define DRAKE_FIRE_TEMP 500 +///used whenever the drake generates a hotspot +#define DRAKE_FIRE_EXPOSURE 50 + /* ASH DRAKE @@ -148,7 +153,7 @@ Difficulty: Medium break range-- new /obj/effect/hotspot(J) - J.hotspot_expose(700,50,1) + J.hotspot_expose(DRAKE_FIRE_TEMP, DRAKE_FIRE_EXPOSURE, 1) for(var/mob/living/L in J.contents - hit_things) if(istype(L, /mob/living/simple_animal/hostile/megafauna/dragon)) continue @@ -404,7 +409,7 @@ Difficulty: Medium if(istype(T, /turf/closed)) break new /obj/effect/hotspot(T) - T.hotspot_expose(700,50,1) + T.hotspot_expose(DRAKE_FIRE_TEMP,DRAKE_FIRE_EXPOSURE,1) for(var/mob/living/L in T.contents) if(L in hit_list || L == source) continue diff --git a/code/modules/research/nanites/nanite_programs/utility.dm b/code/modules/research/nanites/nanite_programs/utility.dm index ebe623d73d..f5372738db 100644 --- a/code/modules/research/nanites/nanite_programs/utility.dm +++ b/code/modules/research/nanites/nanite_programs/utility.dm @@ -51,7 +51,7 @@ rogue_types = list(/datum/nanite_program/toxic) /datum/nanite_program/self_scan/register_extra_settings() - extra_settings[NES_SCAN_TYPE] = new /datum/nanite_extra_setting/type("Medical", list("Medical", "Chemical", "Nanite")) + extra_settings[NES_SCAN_TYPE] = new /datum/nanite_extra_setting/type("Medical", list("Medical", "Chemical", "Wound", "Nanite")) /datum/nanite_program/self_scan/on_trigger(comm_message) if(host_mob.stat == DEAD) @@ -62,6 +62,8 @@ healthscan(host_mob, host_mob) if("Chemical") chemscan(host_mob, host_mob) + if("Wound") + woundscan(host_mob, host_mob) if("Nanite") SEND_SIGNAL(host_mob, COMSIG_NANITE_SCAN, host_mob, TRUE) diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 584a0a189a..150016f570 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -166,6 +166,7 @@ sharpness = IS_SHARP_ACCURATE tool_behaviour = TOOL_SCALPEL toolspeed = 1 + bare_wound_bonus = 20 /obj/item/scalpel/Initialize() . = ..() @@ -247,6 +248,8 @@ sharpness = IS_SHARP tool_behaviour = TOOL_SAW toolspeed = 1 + wound_bonus = 10 + bare_wound_bonus = 15 /obj/item/circular_saw/Initialize() . = ..() @@ -374,3 +377,18 @@ advanced_surgeries |= OC.advanced_surgeries return TRUE return + +/obj/item/bonesetter + name = "bonesetter" + desc = "For setting things right." + icon = 'icons/obj/surgery.dmi' + icon_state = "bone setter" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + custom_materials = list(/datum/material/iron=5000, /datum/material/glass=2500) + flags_1 = CONDUCT_1 + item_flags = SURGICAL_TOOL + w_class = WEIGHT_CLASS_SMALL + attack_verb = list("corrected", "properly set") + tool_behaviour = TOOL_BONESET + toolspeed = 1 diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 7adf0512de..2a8e8763a2 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -479,7 +479,7 @@ GLOBAL_LIST_EMPTY(vending_products) var/crit_case if(crit) - crit_case = rand(1,5) + crit_case = rand(1,6) if(forcecrit) crit_case = forcecrit @@ -491,7 +491,7 @@ GLOBAL_LIST_EMPTY(vending_products) if(istype(C)) var/crit_rebate = 0 // lessen the normal damage we deal for some of the crits - if(crit_case != 5) // the head asplode case has its own description + if(crit_case < 5) // the head asplode case has its own description C.visible_message("[C] is crushed by [src]!", \ "You are crushed by [src]!") @@ -501,10 +501,10 @@ GLOBAL_LIST_EMPTY(vending_products) C.bleed(150) var/obj/item/bodypart/l_leg/l = C.get_bodypart(BODY_ZONE_L_LEG) if(l) - l.receive_damage(brute=200, updating_health=TRUE) + l.receive_damage(brute=200) var/obj/item/bodypart/r_leg/r = C.get_bodypart(BODY_ZONE_R_LEG) if(r) - r.receive_damage(brute=200, updating_health=TRUE) + r.receive_damage(brute=200) if(l || r) C.visible_message("[C]'s legs shatter with a sickening crunch!", \ "Your legs shatter with a sickening crunch!") @@ -526,7 +526,18 @@ GLOBAL_LIST_EMPTY(vending_products) // the new paraplegic gets like 4 lines of losing their legs so skip them visible_message("[C]'s spinal cord is obliterated with a sickening crunch!", ignored_mobs = list(C)) C.gain_trauma(/datum/brain_trauma/severe/paralysis/spinesnapped) - if(5) // skull squish! + if(5) // limb squish! + for(var/i in C.bodyparts) + var/obj/item/bodypart/squish_part = i + if(squish_part.is_organic_limb()) + //var/type_wound = pick(WOUND_LIST_BONE) + var/type_wound = pick(list(/datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/critical, /datum/wound/brute/bone/severe, /datum/wound/brute/bone/moderate)) + squish_part.force_wound_upwards(type_wound) + else + squish_part.receive_damage(brute=30) + C.visible_message("[C]'s body is maimed underneath the mass of [src]!", \ + "Your body is maimed underneath the mass of [src]!") + if(6) // skull squish! var/obj/item/bodypart/head/O = C.get_bodypart(BODY_ZONE_HEAD) if(O) C.visible_message("[O] explodes in a shower of gore beneath [src]!", \ @@ -536,7 +547,11 @@ GLOBAL_LIST_EMPTY(vending_products) qdel(O) new /obj/effect/gibspawner/human/bodypartless(get_turf(C)) - C.apply_damage(max(0, squish_damage - crit_rebate), forced=TRUE, spread_damage=TRUE) + if(prob(30)) + C.apply_damage(max(0, squish_damage - crit_rebate), forced=TRUE, spread_damage=TRUE) // the 30% chance to spread the damage means you escape breaking any bones + else + C.take_bodypart_damage((squish_damage - crit_rebate)*0.5, wound_bonus = 5) // otherwise, deal it to 2 random limbs (or the same one) which will likely shatter something + C.take_bodypart_damage((squish_damage - crit_rebate)*0.5, wound_bonus = 5) C.AddElement(/datum/element/squish, 18 SECONDS) else L.visible_message("[L] is crushed by [src]!", \ diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index fbd9a10bf2..34de3b490c 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -29,7 +29,12 @@ /obj/item/storage/hypospraykit/brute = 2, /obj/item/storage/hypospraykit/enlarge = 2, /obj/item/reagent_containers/glass/bottle/vial/small = 5, - /obj/item/storage/briefcase/medical = 2) + /obj/item/storage/briefcase/medical = 2, + /obj/item/stack/sticky_tape/surgical = 3, + /obj/item/healthanalyzer/wound = 4, + /obj/item/stack/medical/ointment = 2, + /obj/item/stack/medical/suture = 2, + /obj/item/stack/medical/bone_gel = 4) contraband = list(/obj/item/reagent_containers/pill/tox = 3, /obj/item/reagent_containers/pill/morphine = 4, /obj/item/reagent_containers/pill/charcoal = 6) diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm index 09719e1d56..31f3dc49f1 100644 --- a/code/modules/vending/medical_wall.dm +++ b/code/modules/vending/medical_wall.dm @@ -11,6 +11,8 @@ /obj/item/reagent_containers/medspray/silver_sulf = 2, /obj/item/reagent_containers/pill/charcoal = 2, /obj/item/reagent_containers/medspray/sterilizine = 1, + /obj/item/healthanalyzer/wound = 2, + /obj/item/stack/medical/bone_gel = 2, /obj/item/reagent_containers/syringe/dart = 10) contraband = list(/obj/item/reagent_containers/pill/tox = 2, /obj/item/reagent_containers/pill/morphine = 2) diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index d4d92f54c4..f98705872f 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -14,6 +14,9 @@ force = 21 // Just enough to break airlocks with melee attacks damtype = "brute" total_mass = TOTAL_MASS_HAND_REPLACEMENT + sharpness = IS_SHARP + wound_bonus = -30 + bare_wound_bonus = 15 /obj/item/zombie_hand/Initialize() . = ..() From 7714fcfaba441e0384b9785fd9b0a4ddf9950557 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 18 Jul 2020 01:26:38 +0100 Subject: [PATCH 035/122] more changes --- code/__DEFINES/mobs.dm | 1 + code/datums/wounds/_wounds.dm | 320 ++++++++++++ code/datums/wounds/cuts.dm | 9 +- code/game/objects/objs.dm | 5 + .../mob/living/carbon/carbon_defense.dm | 10 +- .../mob/living/carbon/carbon_defines.dm | 5 + .../modules/mob/living/carbon/damage_procs.dm | 21 +- code/modules/mob/living/carbon/examine.dm | 40 ++ .../mob/living/carbon/human/damage_procs.dm | 6 +- .../mob/living/carbon/human/examine.dm | 69 ++- code/modules/mob/living/carbon/human/human.dm | 11 + .../mob/living/carbon/human/human_defense.dm | 57 ++- .../mob/living/carbon/human/human_defines.dm | 1 - .../mob/living/carbon/human/human_helpers.dm | 19 + .../mob/living/carbon/human/species.dm | 16 +- .../carbon/human/species_types/humans.dm | 2 +- .../human/species_types/lizardpeople.dm | 2 +- .../carbon/human/species_types/mushpeople.dm | 2 +- .../carbon/human/species_types/podpeople.dm | 2 +- .../human/species_types/shadowpeople.dm | 2 +- .../carbon/human/species_types/zombies.dm | 8 +- code/modules/mob/living/carbon/life.dm | 6 + .../mob/living/carbon/monkey/punpun.dm | 2 + code/modules/mob/living/damage_procs.dm | 4 +- code/modules/mob/living/life.dm | 5 + code/modules/mob/living/living.dm | 2 +- code/modules/mob/living/living_defense.dm | 4 +- .../mob/living/silicon/damage_procs.dm | 2 +- .../mob/living/silicon/robot/robot_modules.dm | 2 + .../mob/living/simple_animal/hostile/bear.dm | 15 +- .../hostile/megafauna/hierophant.dm | 2 +- .../simple_animal/hostile/megafauna/legion.dm | 2 + .../hostile/megafauna/wendigo.dm | 2 +- .../living/simple_animal/hostile/syndicate.dm | 3 + .../mob/living/simple_animal/simple_animal.dm | 7 + .../ammunition/ballistic/shotgun.dm | 12 + .../projectiles/ammunition/energy/laser.dm | 5 + code/modules/projectiles/gun.dm | 5 + code/modules/projectiles/guns/energy/laser.dm | 6 + code/modules/projectiles/projectile.dm | 4 + code/modules/projectiles/projectile/beams.dm | 18 + .../modules/projectiles/projectile/bullets.dm | 1 + .../projectile/bullets/revolver.dm | 3 + .../projectiles/projectile/bullets/shotgun.dm | 15 +- .../chemistry/reagents/medicine_reagents.dm | 29 +- .../chemistry/reagents/other_reagents.dm | 33 ++ .../chemistry/reagents/toxin_reagents.dm | 16 +- .../reagents/reagent_containers/hypospray.dm | 13 +- ...utolathe_designs_medical_and_dinnerware.dm | 18 + .../research/techweb/nodes/medical_nodes.dm | 2 +- code/modules/spells/spell_types/bloodcrawl.dm | 5 + code/modules/spells/spell_types/shapeshift.dm | 4 +- .../bodyparts/{bodyparts.dm => _bodyparts.dm} | 484 +++++++----------- .../surgery/bodyparts/dismemberment.dm | 23 +- code/modules/surgery/bodyparts/head.dm | 4 + code/modules/surgery/bodyparts/helpers.dm | 10 + code/modules/surgery/bodyparts/parts.dm | 307 +++++++++++ code/modules/surgery/bone_mending.dm | 142 +++++ code/modules/surgery/burn_dressing.dm | 108 ++++ code/modules/surgery/coronary_bypass.dm | 9 +- .../surgery/experimental_dissection.dm | 4 +- code/modules/surgery/healing.dm | 2 +- code/modules/surgery/organic_steps.dm | 14 +- code/modules/surgery/organs/vocal_cords.dm | 5 +- code/modules/surgery/surgery.dm | 7 + tgstation.dme | 6 +- 66 files changed, 1587 insertions(+), 393 deletions(-) create mode 100644 code/datums/wounds/_wounds.dm rename code/modules/surgery/bodyparts/{bodyparts.dm => _bodyparts.dm} (72%) create mode 100644 code/modules/surgery/bodyparts/parts.dm create mode 100644 code/modules/surgery/bone_mending.dm create mode 100644 code/modules/surgery/burn_dressing.dm diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index b1f7cc84f8..ddb901f24c 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -308,6 +308,7 @@ #define GRAB_PIXEL_SHIFT_NECK 16 #define SLEEP_CHECK_DEATH(X) sleep(X); if(QDELETED(src) || stat == DEAD) return; +#define INTERACTING_WITH(X, Y) (Y in X.do_afters) /// Field of vision defines. #define FOV_90_DEGREES 90 diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm new file mode 100644 index 0000000000..d70a4ebdb2 --- /dev/null +++ b/code/datums/wounds/_wounds.dm @@ -0,0 +1,320 @@ +/* + Wounds are specific medical complications that can arise and be applied to (currently) carbons, with a focus on humans. All of the code for and related to this is heavily WIP, + and the documentation will be slanted towards explaining what each part/piece is leading up to, until such a time as I finish the core implementations. The original design doc + can be found at https://hackmd.io/@Ryll/r1lb4SOwU + + Wounds are datums that operate like a mix of diseases, brain traumas, and components, and are applied to a /obj/item/bodypart (preferably attached to a carbon) when they take large spikes of damage + or under other certain conditions (thrown hard against a wall, sustained exposure to plasma fire, etc). Wounds are categorized by the three following criteria: + 1. Severity: Either MODERATE, SEVERE, or CRITICAL. See the hackmd for more details + 2. Viable zones: What body parts the wound is applicable to. Generic wounds like broken bones and severe burns can apply to every zone, but you may want to add special wounds for certain limbs + like a twisted ankle for legs only, or open air exposure of the organs for particularly gruesome chest wounds. Wounds should be able to function for every zone they are marked viable for. + 3. Damage type: Currently either BRUTE or BURN. Again, see the hackmd for a breakdown of my plans for each type. + + When a body part suffers enough damage to get a wound, the severity (determined by a roll or something, worse damage leading to worse wounds), affected limb, and damage type sustained are factored into + deciding what specific wound will be applied. I'd like to have a few different types of wounds for at least some of the choices, but I'm just doing rough generals for now. Expect polishing +*/ + +/datum/wound + /// What it's named + var/name = "ouchie" + /// The description shown on the scanners + var/desc = "" + /// The basic treatment suggested by health analyzers + var/treat_text = "" + /// What the limb looks like on a cursory examine + var/examine_desc = "is badly hurt" + + /// needed for "your arm has a compound fracture" vs "your arm has some third degree burns" + var/a_or_from = "a" + /// The visible message when this happens + var/occur_text = "" + /// This sound will be played upon the wound being applied + var/sound_effect + + /// Either WOUND_SEVERITY_TRIVIAL (meme wounds like stubbed toe), WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_SEVERE, or WOUND_SEVERITY_CRITICAL (or maybe WOUND_SEVERITY_LOSS) + var/severity = WOUND_SEVERITY_MODERATE + /// The list of wounds it belongs in, WOUND_LIST_BONE, WOUND_LIST_CUT, or WOUND_LIST_BURN + var/wound_type + + /// What body zones can we affect + var/list/viable_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + /// Who owns the body part that we're wounding + var/mob/living/carbon/victim = null + /// If we only work on organics (everything right now) + var/organic_only = TRUE + /// The bodypart we're parented to + var/obj/item/bodypart/limb = null + + /// Specific items such as bandages or sutures that can try directly treating this wound + var/list/treatable_by + /// Specific items such as bandages or sutures that can try directly treating this wound only if the user has the victim in an aggressive grab or higher + var/list/treatable_by_grabbed + /// Tools with the specified tool flag will also be able to try directly treating this wound + var/treatable_tool + /// Set to TRUE if we don't give a shit about the patient's comfort and are allowed to just use any random sharp thing on this wound. Will require an aggressive grab or more to perform + var/treatable_sharp + /// How long it will take to treat this wound with a standard effective tool, assuming it doesn't need surgery + var/base_treat_time = 5 SECONDS + + /// Using this limb in a do_after interaction will multiply the length by this duration (arms) + var/interaction_efficiency_penalty = 1 + /// Incoming damage on this limb will be multiplied by this, to simulate tenderness and vulnerability (mostly burns). + var/damage_mulitplier_penalty = 1 + /// If set and this wound is applied to a leg, we take this many deciseconds extra per step on this leg + var/limp_slowdown + /// How much we're contributing to this limb's bleed_rate + var/blood_flow + + /// The minimum we need to roll on [/obj/item/bodypart/proc/check_wounding()] to begin suffering this wound, see check_wounding_mods() for more + var/threshold_minimum + /// How much having this wound will add to all future check_wounding() rolls on this limb, to allow progression to worse injuries with repeated damage + var/threshold_penalty + /// If we need to process each life tick + var/processes = FALSE + + /// If TRUE and an item that can treat multiple different types of coexisting wounds (gauze can be used to splint broken bones, staunch bleeding, and cover burns), we get first dibs if we come up first for it, then become nonpriority. + /// Otherwise, if no untreated wound claims the item, we cycle through the non priority wounds and pick a random one who can use that item. + var/treat_priority = FALSE + + /// If having this wound makes currently makes the parent bodypart unusable + var/disabling + + /// What status effect we assign on application + var/status_effect_type + /// The status effect we're linked to + var/datum/status_effect/linked_status_effect + /// If we're operating on this wound and it gets healed, we'll nix the surgery too + var/datum/surgery/attached_surgery + /// if you're a lazy git and just throw them in cryo, the wound will go away after accumulating severity * 25 power + var/cryo_progress + + /// What kind of scars this wound will create description wise once healed + var/list/scarring_descriptions = list("general disfigurement") + /// If we've already tried scarring while removing (since remove_wound calls qdel, and qdel calls remove wound, .....) TODO: make this cleaner + var/already_scarred = FALSE + /// If we forced this wound through badmin smite, we won't count it towards the round totals + var/from_smite + +/datum/wound/Destroy() + if(attached_surgery) + QDEL_NULL(attached_surgery) + if(limb?.wounds && (src in limb.wounds)) // destroy can call remove_wound() and remove_wound() calls qdel, so we check to make sure there's anything to remove first + remove_wound() + limb = null + victim = null + return ..() + +/** + * apply_wound() is used once a wound type is instantiated to assign it to a bodypart, and actually come into play. + * + * + * Arguments: + * * L: The bodypart we're wounding, we don't care about the person, we can get them through the limb + * * silent: Not actually necessary I don't think, was originally used for demoting wounds so they wouldn't make new messages, but I believe old_wound took over that, I may remove this shortly + * * old_wound: If our new wound is a replacement for one of the same time (promotion or demotion), we can reference the old one just before it's removed to copy over necessary vars + * * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented) + */ +/datum/wound/proc/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE) + if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || isalien(L.owner)) + qdel(src) + return + + if(ishuman(L.owner)) + var/mob/living/carbon/human/H = L.owner + if(organic_only && ((NOBLOOD in H.dna.species.species_traits) || !L.is_organic_limb())) + qdel(src) + return + + // we accept promotions and demotions, but no point in redundancy. This should have already been checked wherever the wound was rolled and applied for (see: bodypart damage code), but we do an extra check + // in case we ever directly add wounds + for(var/i in L.wounds) + var/datum/wound/preexisting_wound = i + if((preexisting_wound.type == type) && (preexisting_wound != old_wound)) + qdel(src) + return + + victim = L.owner + limb = L + LAZYADD(victim.all_wounds, src) + LAZYADD(limb.wounds, src) + limb.update_wounds() + if(status_effect_type) + linked_status_effect = victim.apply_status_effect(status_effect_type, src) + SEND_SIGNAL(victim, COMSIG_CARBON_GAIN_WOUND, src, limb) + if(!victim.alerts["wound"]) // only one alert is shared between all of the wounds + victim.throw_alert("wound", /obj/screen/alert/status_effect/wound) + + var/demoted + if(old_wound) + demoted = (severity <= old_wound.severity) + + if(severity == WOUND_SEVERITY_TRIVIAL) + return + + if(!(silent || demoted)) + var/msg = "[victim]'s [limb.name] [occur_text]!" + var/vis_dist = COMBAT_MESSAGE_RANGE + + if(severity != WOUND_SEVERITY_MODERATE) + msg = "[msg]" + vis_dist = DEFAULT_MESSAGE_RANGE + + victim.visible_message(msg, "Your [limb.name] [occur_text]!", vision_distance = vis_dist) + if(sound_effect) + playsound(L.owner, sound_effect, 60 + 20 * severity, TRUE) + + if(!demoted) + wound_injury(old_wound) + second_wind() + +/// Remove the wound from whatever it's afflicting, and cleans up whateverstatus effects it had or modifiers it had on interaction times. ignore_limb is used for detachments where we only want to forget the victim +/datum/wound/proc/remove_wound(ignore_limb, replaced = FALSE) + //TODO: have better way to tell if we're getting removed without replacement (full heal) scar stuff + if(limb && !already_scarred && !replaced) + already_scarred = TRUE + var/datum/scar/new_scar = new + new_scar.generate(limb, src) + if(victim) + LAZYREMOVE(victim.all_wounds, src) + if(!victim.all_wounds) + victim.clear_alert("wound") + SEND_SIGNAL(victim, COMSIG_CARBON_LOSE_WOUND, src, limb) + if(limb && !ignore_limb) + LAZYREMOVE(limb.wounds, src) + limb.update_wounds() + +/** + * replace_wound() is used when you want to replace the current wound with a new wound, presumably of the same category, just of a different severity (either up or down counts) + * + * This proc actually instantiates the new wound based off the specific type path passed, then returns the new instantiated wound datum. + * + * Arguments: + * * new_type- The TYPE PATH of the wound you want to replace this, like /datum/wound/brute/cut/severe + * * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented) + */ +/datum/wound/proc/replace_wound(new_type, smited = FALSE) + var/datum/wound/new_wound = new new_type + already_scarred = TRUE + remove_wound(replaced=TRUE) + new_wound.apply_wound(limb, old_wound = src, smited = smited) + qdel(src) + return new_wound + +/// The immediate negative effects faced as a result of the wound +/datum/wound/proc/wound_injury(datum/wound/old_wound = null) + return + +/// Additional beneficial effects when the wound is gained, in case you want to give a temporary boost to allow the victim to try an escape or last stand +/datum/wound/proc/second_wind() + if(HAS_TRAIT(victim, TRAIT_NOMETABOLISM)) + return + + switch(severity) + if(WOUND_SEVERITY_MODERATE) + victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_MODERATE) + if(WOUND_SEVERITY_SEVERE) + victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_SEVERE) + if(WOUND_SEVERITY_CRITICAL) + victim.reagents.add_reagent(/datum/reagent/determination, WOUND_DETERMINATION_CRITICAL) + +/** + * try_treating() is an intercept run from [/mob/living/carbon/attackby()] right after surgeries but before anything else. Return TRUE here if the item is something that is relevant to treatment to take over the interaction. + * + * This proc leads into [/datum/wound/proc/treat()] and probably shouldn't be added onto in children types. You can specify what items or tools you want to be intercepted + * with var/list/treatable_by and var/treatable_tool, then if an item fulfills one of those requirements and our wound claims it first, it goes over to treat() and treat_self(). + * + * Arguments: + * * I: The item we're trying to use + * * user: The mob trying to use it on us + */ +/datum/wound/proc/try_treating(obj/item/I, mob/user) + // first we weed out if we're not dealing with our wound's bodypart, or if it might be an attack + if(!I || limb.body_zone != user.zone_selected || (I.force && user.a_intent != INTENT_HELP)) + return FALSE + + var/allowed = FALSE + + // check if we have a valid treatable tool (or, if cauteries are allowed, if we have something hot) + if((I.tool_behaviour == treatable_tool) || (treatable_tool == TOOL_CAUTERY && I.get_temperature())) + allowed = TRUE + // failing that, see if we're aggro grabbing them and if we have an item that works for aggro grabs only + else if(user.pulling == victim && user.grab_state >= GRAB_AGGRESSIVE && check_grab_treatments(I, user)) + allowed = TRUE + // failing THAT, we check if we have a generally allowed item + else + for(var/allowed_type in treatable_by) + if(istype(I, allowed_type)) + allowed = TRUE + break + + // if none of those apply, we return false to avoid interrupting + if(!allowed) + return FALSE + + // now that we've determined we have a valid attempt at treating, we can stomp on their dreams if we're already interacting with the patient + if(INTERACTING_WITH(user, victim)) + to_chat(user, "You're already interacting with [victim]!") + return TRUE + + // lastly, treat them + treat(I, user) + return TRUE + +/// Return TRUE if we have an item that can only be used while aggro grabbed (unhanded aggro grab treatments go in [/datum/wound/proc/try_handling()]). Treatment is still is handled in [/datum/wound/proc/treat()] +/datum/wound/proc/check_grab_treatments(obj/item/I, mob/user) + return FALSE + +/// Like try_treating() but for unhanded interactions from humans, used by joint dislocations for manual bodypart chiropractice for example. +/datum/wound/proc/try_handling(mob/living/carbon/human/user) + return FALSE + +/// Someone is using something that might be used for treating the wound on this limb +/datum/wound/proc/treat(obj/item/I, mob/user) + return + +/// If var/processing is TRUE, this is run on each life tick +/datum/wound/proc/handle_process() + return + +/// For use in do_after callback checks +/datum/wound/proc/still_exists() + return (!QDELETED(src) && limb) + +/// When our parent bodypart is hurt +/datum/wound/proc/receive_damage(wounding_type, wounding_dmg, wound_bonus) + return + +/// Called from cryoxadone and pyroxadone when they're proc'ing. Wounds will slowly be fixed separately from other methods when these are in effect. crappy name but eh +/datum/wound/proc/on_xadone(power) + cryo_progress += power + if(cryo_progress > 33 * severity) + qdel(src) + +/// Called when we're crushed in an airlock or firedoor, for one of the improvised joint dislocation fixes +/datum/wound/proc/crush() + return + +/** + * get_examine_description() is used in carbon/examine and human/examine to show the status of this wound. Useful if you need to show some status like the wound being splinted or bandaged. + * + * Return the full string line you want to show, note that we're already dealing with the 'warning' span at this point, and that \n is already appended for you in the place this is called from + * + * Arguments: + * * mob/user: The user examining the wound's owner, if that matters + */ +/datum/wound/proc/get_examine_description(mob/user) + return "[victim.p_their(TRUE)] [limb.name] [examine_desc]!" + +/datum/wound/proc/get_scanner_description(mob/user) + return "Type: [name]\nSeverity: [severity_text()]\nDescription: [desc]\nRecommended Treatment: [treat_text]" + +/datum/wound/proc/severity_text() + switch(severity) + if(WOUND_SEVERITY_TRIVIAL) + return "Trivial" + if(WOUND_SEVERITY_MODERATE) + return "Moderate" + if(WOUND_SEVERITY_SEVERE) + return "Severe" + if(WOUND_SEVERITY_CRITICAL) + return "Critical" diff --git a/code/datums/wounds/cuts.dm b/code/datums/wounds/cuts.dm index 61a4b8a1ea..5f9d754238 100644 --- a/code/datums/wounds/cuts.dm +++ b/code/datums/wounds/cuts.dm @@ -179,8 +179,7 @@ /datum/wound/brute/cut/proc/tool_cauterize(obj/item/I, mob/user) var/self_penalty_mult = (user == victim ? 1.5 : 1) user.visible_message("[user] begins cauterizing [victim]'s [limb.name] with [I]...", "You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") - var/time_mod = user.mind?.get_skill_modifier(/datum/skill/healing, SKILL_SPEED_MODIFIER) || 1 - if(!do_after(user, base_treat_time * time_mod * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) + if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) return user.visible_message("[user] cauterizes some of the bleeding on [victim].", "You cauterize some of the bleeding on [victim].") @@ -200,8 +199,7 @@ /datum/wound/brute/cut/proc/suture(obj/item/stack/medical/suture/I, mob/user) var/self_penalty_mult = (user == victim ? 1.4 : 1) user.visible_message("[user] begins stitching [victim]'s [limb.name] with [I]...", "You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") - var/time_mod = user.mind?.get_skill_modifier(/datum/skill/healing, SKILL_SPEED_MODIFIER) || 1 - if(!do_after(user, base_treat_time * time_mod * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) + if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) return user.visible_message("[user] stitches up some of the bleeding on [victim].", "You stitch up some of the bleeding on [user == victim ? "yourself" : "[victim]"].") var/blood_sutured = I.stop_bleeding / self_penalty_mult @@ -224,8 +222,7 @@ user.visible_message("[user] begins rewrapping the cuts on [victim]'s [limb.name] with [I]...", "You begin rewrapping the cuts on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") else user.visible_message("[user] begins wrapping the cuts on [victim]'s [limb.name] with [I]...", "You begin wrapping the cuts on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") - var/time_mod = user.mind?.get_skill_modifier(/datum/skill/healing, SKILL_SPEED_MODIFIER) || 1 - if(!do_after(user, base_treat_time * time_mod, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) + if(!do_after(user, base_treat_time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) return user.visible_message("[user] applies [I] to [victim]'s [limb.name].", "You bandage some of the bleeding on [user == victim ? "yourself" : "[victim]"].") diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index ba3eba9bd3..c54c49b7e5 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -10,6 +10,11 @@ var/damtype = BRUTE var/force = 0 + /// How good a given object is at causing wounds on carbons. Higher values equal better shots at creating serious wounds. + var/wound_bonus = 0 + /// If this attacks a human with no wound armor on the affected body part, add this to the wound mod. Some attacks may be significantly worse at wounding if there's even a slight layer of armor to absorb some of it vs bare flesh + var/bare_wound_bonus = 0 + var/datum/armor/armor var/obj_integrity //defaults to max_integrity var/max_integrity = 500 diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index bfa9c40a7c..ea42c4df2f 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -79,7 +79,7 @@ send_item_attack_message(I, user, affecting.name, totitemdamage) I.do_stagger_action(src, user, totitemdamage) if(I.force) - apply_damage(totitemdamage, I.damtype, affecting) //CIT CHANGE - replaces I.force with totitemdamage + apply_damage(totitemdamage, I.damtype, affecting, wound_bonus = I.wound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness()) //CIT CHANGE - replaces I.force with totitemdamage if(I.damtype == BRUTE && affecting.status == BODYPART_ORGANIC) var/basebloodychance = affecting.brute_dam + totitemdamage if(prob(basebloodychance)) @@ -132,6 +132,9 @@ if(S.next_step(user, user.a_intent)) return TRUE + for(var/datum/wound/W in all_wounds) + if(W.try_handling(user)) + return 1 /mob/living/carbon/attack_paw(mob/living/carbon/monkey/M) @@ -467,3 +470,8 @@ if (BP.status < 2) amount += BP.burn_dam return amount + +/mob/living/carbon/proc/get_interaction_efficiency(zone) + var/obj/item/bodypart/limb = get_bodypart(zone) + if(!limb) + return diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 15413f76d4..cce3fb6a9b 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -64,3 +64,8 @@ var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects var/tackling = FALSE //Whether or not we are tackling, this will prevent the knock into effects for carbons + + /// All of the wounds a carbon has afflicted throughout their limbs + var/list/all_wounds + /// All of the scars a carbon has afflicted throughout their limbs + var/list/all_scars diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index becff250b9..61b14b2cce 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -1,6 +1,6 @@ -/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE) +/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone) var/hit_percent = (100-blocked)/100 if(!forced && hit_percent <= 0) @@ -21,13 +21,13 @@ switch(damagetype) if(BRUTE) if(BP) - if(damage > 0 ? BP.receive_damage(damage_amount) : BP.heal_damage(abs(damage_amount), 0)) + if(BP.receive_damage(damage_amount, 0, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness)) update_damage_overlays() else //no bodypart, we deal damage with a more general method. adjustBruteLoss(damage_amount, forced = forced) if(BURN) if(BP) - if(damage > 0 ? BP.receive_damage(0, damage_amount) : BP.heal_damage(0, abs(damage_amount))) + if(BP.receive_damage(0, damage_amount, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness)) update_damage_overlays() else adjustFireLoss(damage_amount, forced = forced) @@ -202,12 +202,12 @@ //Damages ONE bodypart randomly selected from damagable ones. //It automatically updates damage overlays if necessary //It automatically updates health status -/mob/living/carbon/take_bodypart_damage(brute = 0, burn = 0, stamina = 0) +/mob/living/carbon/take_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status, check_armor = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) var/list/obj/item/bodypart/parts = get_damageable_bodyparts() if(!parts.len) return var/obj/item/bodypart/picked = pick(parts) - if(picked.receive_damage(brute, burn, stamina)) + if(picked.receive_damage(brute, burn, stamina,check_armor ? run_armor_check(picked, (brute ? "melee" : burn ? "fire" : stamina ? "bullet" : null)) : FALSE, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness)) update_damage_overlays() //Heal MANY bodyparts, in random order @@ -253,7 +253,7 @@ var/stamina_was = picked.stamina_dam - update |= picked.receive_damage(brute_per_part, burn_per_part, stamina_per_part, FALSE) + update |= picked.receive_damage(brute_per_part, burn_per_part, stamina_per_part, FALSE, required_status, wound_bonus = CANT_WOUND) // disabling wounds from these for now cuz your entire body snapping cause your heart stopped would suck brute = round(brute - (picked.brute_dam - brute_was), DAMAGE_PRECISION) burn = round(burn - (picked.burn_dam - burn_was), DAMAGE_PRECISION) @@ -265,3 +265,12 @@ if(update) update_damage_overlays() update_stamina() + +///Returns a list of bodyparts with wounds (in case someone has a wound on an otherwise fully healed limb) +/mob/living/carbon/proc/get_wounded_bodyparts(brute = FALSE, burn = FALSE, stamina = FALSE, status) + var/list/obj/item/bodypart/parts = list() + for(var/X in bodyparts) + var/obj/item/bodypart/BP = X + if(LAZYLEN(BP.wounds)) + parts += BP + return parts diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index b07aab30d1..be046a3713 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -44,6 +44,8 @@ msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] stuck to [t_his] [BP.name]!\n" else msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!\n" + for(var/datum/wound/W in BP.wounds) + msg += "[W.get_examine_description(user)]\n" for(var/X in disabled) var/obj/item/bodypart/BP = X @@ -99,6 +101,22 @@ if(pulledby && pulledby.grab_state) msg += "[t_He] [t_is] restrained by [pulledby]'s grip.\n" + var/scar_severity = 0 + for(var/i in all_scars) + var/datum/scar/S = i + if(S.is_visible(user)) + scar_severity += S.severity + + switch(scar_severity) + if(1 to 2) + msg += "[t_He] [t_has] visible scarring, you can look again to take a closer look...\n" + if(3 to 4) + msg += "[t_He] [t_has] several bad scars, you can look again to take a closer look...\n" + if(5 to 6) + msg += "[t_He] [t_has] significantly disfiguring scarring, you can look again to take a closer look...\n" + if(7 to INFINITY) + msg += "[t_He] [t_is] just absolutely fucked up, you can look again to take a closer look...\n" + if(msg.len) . += "[msg.Join("")]" @@ -135,3 +153,25 @@ . += "[t_He] look[p_s()] ecstatic." SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) . += "*---------*" + +/mob/living/carbon/examine_more(mob/user) + if(!all_scars) + return ..() + + var/list/visible_scars + for(var/i in all_scars) + var/datum/scar/S = i + if(S.is_visible(user)) + LAZYADD(visible_scars, S) + + if(!visible_scars) + return ..() + + var/msg = list("You examine [src] closer, and note the following...") + for(var/i in visible_scars) + var/datum/scar/S = i + var/scar_text = S.get_examine_description(user) + if(scar_text) + msg += "[scar_text]" + + return msg diff --git a/code/modules/mob/living/carbon/human/damage_procs.dm b/code/modules/mob/living/carbon/human/damage_procs.dm index 651fec8415..5cd00b7e6a 100644 --- a/code/modules/mob/living/carbon/human/damage_procs.dm +++ b/code/modules/mob/living/carbon/human/damage_procs.dm @@ -1,5 +1,5 @@ +// depending on the species, it will run the corresponding apply_damage code there +/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) + return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness) -/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage) - // depending on the species, it will run the corresponding apply_damage code there - return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced, spread_damage) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index d32184edb5..77137c7239 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -163,16 +163,18 @@ msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] stuck to [t_his] [BP.name]!\n" else msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!\n" + for(var/datum/wound/W in BP.wounds) + msg += "[W.get_examine_description(user)]\n" for(var/X in disabled) var/obj/item/bodypart/BP = X var/damage_text - if(!(BP.get_damage(include_stamina = FALSE) >= BP.max_damage)) //Stamina is disabling the limb - damage_text = "limp and lifeless" - else - damage_text = (BP.brute_dam >= BP.burn_dam) ? BP.heavy_brute_msg : BP.heavy_burn_msg - msg += "[capitalize(t_his)] [BP.name] is [damage_text]!\n" - + if(BP.is_disabled() != BODYPART_DISABLED_WOUND) // skip if it's disabled by a wound (cuz we'll be able to see the bone sticking out!) + if(!(BP.get_damage(include_stamina = FALSE) >= BP.max_damage)) //we don't care if it's stamcritted + damage_text = "limp and lifeless" + else + damage_text = (BP.brute_dam >= BP.burn_dam) ? BP.heavy_brute_msg : BP.heavy_burn_msg + msg += "[capitalize(t_his)] [BP.name] is [damage_text]!\n" //stores missing limbs var/l_limbs_missing = 0 var/r_limbs_missing = 0 @@ -246,16 +248,40 @@ if(DISGUST_LEVEL_DISGUSTED to INFINITY) msg += "[t_He] look[p_s()] extremely disgusted.\n" - if(ShowAsPaleExamine()) - msg += "[t_He] [t_has] pale skin.\n" + var/apparent_blood_volume = blood_volume + if(skin_tone == "albino") + apparent_blood_volume -= 150 // enough to knock you down one tier + switch(apparent_blood_volume) + if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) + msg += "[t_He] [t_has] pale skin.\n" + if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY) + msg += "[t_He] look[p_s()] like pale death.\n" + if(-INFINITY to BLOOD_VOLUME_BAD) + msg += "[t_He] resemble[p_s()] a crushed, empty juice pouch.\n" if(bleedsuppress) - msg += "[t_He] [t_is] bandaged with something.\n" - else if(bleed_rate) - if(bleed_rate >= 8) //8 is the rate at which heparin causes you to bleed - msg += "[t_He] [t_is] bleeding uncontrollably!\n" - else - msg += "[t_He] [t_is] bleeding!\n" + msg += "[t_He] [t_is] embued with a power that defies bleeding.\n" // only statues and highlander sword can cause this so whatever + else if(is_bleeding()) + var/list/obj/item/bodypart/bleeding_limbs = list() + + for(var/i in bodyparts) + var/obj/item/bodypart/BP = i + if(BP.get_bleed_rate()) + bleeding_limbs += BP + + var/num_bleeds = LAZYLEN(bleeding_limbs) + var/bleed_text = "[t_He] [t_is] bleeding from [t_his]" + switch(num_bleeds) + if(1 to 2) + bleed_text += " [bleeding_limbs[1].name][num_bleeds == 2 ? " and [bleeding_limbs[2].name]" : ""]" + if(3 to INFINITY) + for(var/i in 1 to (num_bleeds - 1)) + var/obj/item/bodypart/BP = bleeding_limbs[i] + bleed_text += " [BP.name]," + bleed_text += " and [bleeding_limbs[num_bleeds].name]" + + bleed_text += "!\n" + msg += bleed_text if(reagents.has_reagent(/datum/reagent/teslium)) msg += "[t_He] [t_is] emitting a gentle blue glow!\n" @@ -331,6 +357,21 @@ if(digitalcamo) msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly inhuman manner.\n" + var/scar_severity = 0 + for(var/i in all_scars) + var/datum/scar/S = i + if(S.is_visible(user)) + scar_severity += S.severity + + switch(scar_severity) + if(1 to 2) + msg += "[t_He] [t_has] visible scarring, you can look again to take a closer look...\n" + if(3 to 4) + msg += "[t_He] [t_has] several bad scars, you can look again to take a closer look...\n" + if(5 to 6) + msg += "[t_He] [t_has] significantly disfiguring scarring, you can look again to take a closer look...\n" + if(7 to INFINITY) + msg += "[t_He] [t_is] just absolutely fucked up, you can look again to take a closer look...\n" if (length(msg)) . += "[msg.Join("")]" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index a2d53f6f0a..033b3bf42e 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1055,10 +1055,21 @@ remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown) remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying) + /mob/living/carbon/human/do_after_coefficent() . = ..() . *= physiology.do_after_speed +/mob/living/carbon/human/is_bleeding() + if(NOBLOOD in dna.species.species_traits || bleedsuppress) + return FALSE + return ..() + +/mob/living/carbon/human/get_total_bleed_rate() + if(NOBLOOD in dna.species.species_traits) + return FALSE + return ..() + /mob/living/carbon/human/species var/race = null diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 63296021ff..c592301b96 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -34,6 +34,19 @@ protection += physiology.armor.getRating(d_type) return protection +///Get all the clothing on a specific body part +/mob/living/carbon/human/proc/clothingonpart(obj/item/bodypart/def_zone) + var/list/covering_part = list() + var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, back, gloves, shoes, belt, s_store, glasses, ears, wear_id, wear_neck) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor) + for(var/bp in body_parts) + if(!bp) + continue + if(bp && istype(bp , /obj/item/clothing)) + var/obj/item/clothing/C = bp + if(C.body_parts_covered & def_zone.body_part) + covering_part += C + return covering_part + /mob/living/carbon/human/on_hit(obj/item/projectile/P) if(dna && dna.species) dna.species.on_hit(P, src) @@ -106,7 +119,7 @@ visible_message("[user] [hulk_verb_continous] [src]!", \ "[user] [hulk_verb_continous] you!", null, COMBAT_MESSAGE_RANGE, null, user, "You [hulk_verb_simple] [src]!") - adjustBruteLoss(15) + apply_damage(15, BRUTE, wound_bonus=10) return 1 /mob/living/carbon/human/attack_hand(mob/user) @@ -217,16 +230,17 @@ if(!affecting) affecting = get_bodypart(BODY_ZONE_CHEST) var/armor = run_armor_check(affecting, "melee", armour_penetration = M.armour_penetration) - apply_damage(damage, M.melee_damage_type, affecting, armor) - + apply_damage(damage, M.melee_damage_type, affecting, armor, wound_bonus = M.wound_bonus, bare_wound_bonus = M.bare_wound_bonus, sharpness = M.sharpness) /mob/living/carbon/human/attack_slime(mob/living/simple_animal/slime/M) . = ..() if(!.) //unsuccessful slime attack return var/damage = rand(5, 25) + var/wound_mod = -45 // 25^1.4=90, 90-45=45 if(M.is_adult) damage = rand(10, 35) + wound_mod = -90 // 35^1.4=145, 145-90=55 var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) if(!dam_zone) //Dismemberment successful @@ -236,7 +250,7 @@ if(!affecting) affecting = get_bodypart(BODY_ZONE_CHEST) var/armor_block = run_armor_check(affecting, "melee") - apply_damage(damage, BRUTE, affecting, armor_block) + apply_damage(damage, BRUTE, affecting, armor_block, wound_bonus=wound_mod) /mob/living/carbon/human/mech_melee_attack(obj/mecha/M) if(M.occupant.a_intent == INTENT_HARM) @@ -614,6 +628,20 @@ no_damage = TRUE to_send += "\t Your [LB.name] [HAS_TRAIT(src, TRAIT_SELF_AWARE) ? "has" : "is"] [status].\n" + for(var/thing in LB.wounds) + var/datum/wound/W = thing + var/msg + switch(W.severity) + if(WOUND_SEVERITY_TRIVIAL) + msg = "\t Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]." + if(WOUND_SEVERITY_MODERATE) + msg = "\t Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!" + if(WOUND_SEVERITY_SEVERE) + msg = "\t Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!" + if(WOUND_SEVERITY_CRITICAL) + msg = "\t Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!!" + to_chat(src, msg) + for(var/obj/item/I in LB.embedded_objects) if(I.isEmbedHarmless()) to_chat(src, "\t There is \a [I] stuck to your [LB.name]!") @@ -623,8 +651,25 @@ for(var/t in missing) to_send += "Your [parse_zone(t)] is missing!\n" - if(bleed_rate) - to_send += "You are bleeding!\n" + if(is_bleeding()) + var/list/obj/item/bodypart/bleeding_limbs = list() + for(var/i in bodyparts) + var/obj/item/bodypart/BP = i + if(BP.get_bleed_rate()) + bleeding_limbs += BP + + var/num_bleeds = LAZYLEN(bleeding_limbs) + var/bleed_text = "You are bleeding from your" + switch(num_bleeds) + if(1 to 2) + bleed_text += " [bleeding_limbs[1].name][num_bleeds == 2 ? " and [bleeding_limbs[2].name]" : ""]" + if(3 to INFINITY) + for(var/i in 1 to (num_bleeds - 1)) + var/obj/item/bodypart/BP = bleeding_limbs[i] + bleed_text += " [BP.name]," + bleed_text += " and [bleeding_limbs[num_bleeds].name]" + bleed_text += "!" + to_chat(src, bleed_text) if(getStaminaLoss()) if(getStaminaLoss() > 30) to_send += "You're completely exhausted.\n" diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index e7be540eb9..71005334f8 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -49,7 +49,6 @@ var/special_voice = "" // For changing our voice. Used by a symptom. - var/bleed_rate = 0 //how much are we bleeding var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding var/blood_state = BLOOD_STATE_NOT_BLOODY diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 7c256f5367..8672c0e83d 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -151,3 +151,22 @@ if(blood_dna.len) last_bloodtype = blood_dna[blood_dna[blood_dna.len]]//trust me this works last_blood_DNA = blood_dna[blood_dna.len]*/ + +/// For use formatting all of the scars this human has for saving for persistent scarring +/mob/living/carbon/human/proc/format_scars() + if(!all_scars) + return + var/scars = "" + for(var/i in all_scars) + var/datum/scar/S = i + scars += "[S.format()];" + return scars + +/// Takes a single scar from the persistent scar loader and recreates it from the saved data +/mob/living/carbon/human/proc/load_scar(scar_line) + var/list/scar_data = splittext(scar_line, "|") + if(LAZYLEN(scar_data) != 4) + return // invalid, should delete + var/obj/item/bodypart/BP = get_bodypart("[scar_data[SCAR_SAVE_ZONE]]") + var/datum/scar/S = new + return S.load(BP, scar_data[SCAR_SAVE_DESC], scar_data[SCAR_SAVE_PRECISE_LOCATION], text2num(scar_data[SCAR_SAVE_SEVERITY])) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index efff888c41..50f29a866f 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1728,9 +1728,15 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/armor_block = H.run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened a hit to your [hit_area].",I.armour_penetration) armor_block = min(90,armor_block) //cap damage reduction at 90% var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords) + var/Iwound_bonus = I.wound_bonus + + // this way, you can't wound with a surgical tool on help intent if they have a surgery active and are laying down, so a misclick with a circular saw on the wrong limb doesn't bleed them dry (they still get hit tho) + if((I.item_flags & SURGICAL_TOOL) && user.a_intent == INTENT_HELP && (H.mobility_flags & ~MOBILITY_STAND) && (LAZYLEN(H.surgeries) > 0)) + Iwound_bonus = CANT_WOUND var/weakness = H.check_weakness(I, user) - apply_damage(totitemdamage * weakness, I.damtype, def_zone, armor_block, H) //CIT CHANGE - replaces I.force with totitemdamage + apply_damage(totitemdamage * weakness, I.damtype, def_zone, armor_block, H, wound_bonus = Iwound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness()) + H.send_item_attack_message(I, user, hit_area, totitemdamage) @@ -1945,8 +1951,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) append_message += ", causing them to drop [target_held_item]" log_combat(user, target, "shoved", append_message) -/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE) - SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone) +/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) + SEND_SIGNAL(H, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone, wound_bonus, bare_wound_bonus, sharpness) // make sure putting wound_bonus here doesn't screw up other signals or uses for this signal var/hit_percent = (100-(blocked+armor))/100 hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100 if(!forced && hit_percent <= 0) @@ -1973,7 +1979,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.damageoverlaytemp = 20 var/damage_amount = forced ? damage : damage * hit_percent * brutemod * H.physiology.brute_mod if(BP) - if(damage > 0 ? BP.receive_damage(damage_amount, 0) : BP.heal_damage(abs(damage_amount), 0)) + if(BP.receive_damage(damage_amount, 0, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness)) H.update_damage_overlays() if(HAS_TRAIT(H, TRAIT_MASO) && prob(damage_amount)) H.mob_climax(forced_climax=TRUE) @@ -1984,7 +1990,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.damageoverlaytemp = 20 var/damage_amount = forced ? damage : damage * hit_percent * burnmod * H.physiology.burn_mod if(BP) - if(damage > 0 ? BP.receive_damage(0, damage_amount) : BP.heal_damage(0, abs(damage_amount))) + if(BP.receive_damage(0, damage_amount, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness)) H.update_damage_overlays() else H.adjustFireLoss(damage_amount) diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index 606b7a8bfd..1868bd22df 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -3,7 +3,7 @@ id = "human" default_color = "FFFFFF" - species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS_PARTSONLY,WINGCOLOR) + species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS_PARTSONLY,WINGCOLOR,CAN_SCAR) mutant_bodyparts = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF","tail_human" = "None", "ears" = "None", "taur" = "None", "deco_wings" = "None") use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM skinned_type = /obj/item/stack/sheet/animalhide/human diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index c42e0bf175..a424969175 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -4,7 +4,7 @@ id = "lizard" say_mod = "hisses" default_color = "00FF00" - species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,LIPS,HORNCOLOR,WINGCOLOR) + species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,LIPS,HORNCOLOR,WINGCOLOR,CAN_SCAR) mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs", "taur", "deco_wings") inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE mutanttongue = /obj/item/organ/tongue/lizard diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm index dcb6d868fc..8e8c65b15e 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -8,7 +8,7 @@ nojumpsuit = TRUE say_mod = "poofs" //what does a mushroom sound like - species_traits = list(MUTCOLORS, NOEYES, NO_UNDERWEAR,NOGENITALS,NOAROUSAL) + species_traits = list(MUTCOLORS, NOEYES, NO_UNDERWEAR,NOGENITALS,NOAROUSAL,CAN_SCAR) inherent_traits = list(TRAIT_NOBREATH) speedmod = 1.5 //faster than golems but not by much diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index e79160da06..36a1d52cba 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -3,7 +3,7 @@ name = "Anthromorphic Plant" id = "pod" default_color = "59CE00" - species_traits = list(MUTCOLORS,EYECOLOR) + species_traits = list(MUTCOLORS,EYECOLOR,CAN_SCAR) attack_verb = "slash" attack_sound = 'sound/weapons/slice.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index fede67b47a..da03340ff9 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -10,7 +10,7 @@ ignored_by = list(/mob/living/simple_animal/hostile/faithless) meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/shadow species_traits = list(NOBLOOD,NOEYES) - inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH) + inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH,CAN_SCAR) dangerous_existence = 1 mutanteyes = /obj/item/organ/eyes/night_vision diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index 26a99dbc2b..c0369e7711 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -8,7 +8,7 @@ sexes = 0 blacklisted = 1 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie - species_traits = list(NOBLOOD,NOZOMBIE,NOTRANSSTING) + species_traits = list(NOBLOOD,NOZOMBIE,NOTRANSSTING,CAN_SCAR) inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH,TRAIT_NODEATH,TRAIT_FAKEDEATH) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID mutanttongue = /obj/item/organ/tongue/zombie @@ -45,7 +45,7 @@ /datum/species/zombie/infectious/spec_stun(mob/living/carbon/human/H,amount) . = min(20, amount) -/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE) +/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) . = ..() if(.) regen_cooldown = world.time + REGENERATION_DELAY @@ -62,6 +62,10 @@ heal_amt *= 2 C.heal_overall_damage(heal_amt,heal_amt) C.adjustToxLoss(-heal_amt) + for(var/i in C.all_wounds) + var/datum/wound/W = i + if(prob(4-W.severity)) + W.remove_wound() if(!C.InCritical() && prob(4)) playsound(C, pick(spooks), 50, TRUE, 10) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index b40d87a68a..725feb214c 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -404,6 +404,12 @@ if(stat != DEAD || D.process_dead) D.stage_act() +/mob/living/carbon/handle_wounds() + for(var/thing in all_wounds) + var/datum/wound/W = thing + if(W.processes) // meh + W.handle_process() + //todo generalize this and move hud out /mob/living/carbon/proc/handle_changeling() if(mind && hud_used && hud_used.lingchemdisplay) diff --git a/code/modules/mob/living/carbon/monkey/punpun.dm b/code/modules/mob/living/carbon/monkey/punpun.dm index c5cb4dc713..c59218a8a3 100644 --- a/code/modules/mob/living/carbon/monkey/punpun.dm +++ b/code/modules/mob/living/carbon/monkey/punpun.dm @@ -26,6 +26,8 @@ //These have to be after the parent new to ensure that the monkey //bodyparts are actually created before we try to equip things to //those slots + if(ancestor_chain > 1) + generate_fake_scars(rand(ancestor_chain, ancestor_chain * 4)) if(relic_hat) equip_to_slot_or_del(new relic_hat, SLOT_HEAD) if(relic_mask) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 0c049ab5c1..012808647e 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -14,7 +14,7 @@ * * Returns TRUE if damage applied */ -/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE) +/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) var/hit_percent = (100-blocked)/100 if(!damage || (hit_percent <= 0)) return 0 @@ -245,7 +245,7 @@ update_stamina() // damage ONE external organ, organ gets randomly selected from damaged ones. -/mob/living/proc/take_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE) +/mob/living/proc/take_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status, check_armor = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) adjustBruteLoss(brute, FALSE) //zero as argument for no instant health update adjustFireLoss(burn, FALSE) adjustStaminaLoss(stamina, FALSE) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 1993d86b74..e20567121e 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -45,6 +45,8 @@ /mob/living/proc/BiologicalLife(seconds, times_fired) handle_diseases()// DEAD check is in the proc itself; we want it to spread even if the mob is dead, but to handle its disease-y properties only if you're not. + handle_wounds() + // Everything after this shouldn't process while dead (as of the time of writing) if(stat == DEAD) return FALSE @@ -109,6 +111,9 @@ /mob/living/proc/handle_diseases() return +/mob/living/proc/handle_wounds() + return + /mob/living/proc/handle_diginvis() if(!digitaldisguise) src.digitaldisguise = image(loc = src) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index c7ed6e743d..7fe96b0af7 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -636,7 +636,7 @@ TH.transfer_mob_blood_dna(src) /mob/living/carbon/human/makeTrail(turf/T) - if((NOBLOOD in dna.species.species_traits) || !bleed_rate || bleedsuppress) + if((NOBLOOD in dna.species.species_traits) || !is_bleeding() || bleedsuppress) return ..() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 07252b4c45..d3afad23aa 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -85,7 +85,7 @@ totaldamage = block_calculate_resultant_damage(totaldamage, returnlist) var/armor = run_armor_check(def_zone, P.flag, null, null, P.armour_penetration, null) if(!P.nodamage) - apply_damage(totaldamage, P.damage_type, def_zone, armor) + apply_damage(P.damage, P.damage_type, def_zone, armor, wound_bonus=P.wound_bonus, bare_wound_bonus=P.bare_wound_bonus, sharpness=P.sharpness) if(P.dismemberment) check_projectile_dismemberment(P, def_zone) var/missing = 100 - final_percent @@ -138,7 +138,7 @@ visible_message("[src] has been hit by [I].", \ "You have been hit by [I].") var/armor = run_armor_check(impacting_zone, "melee", "Your armor has protected your [parse_zone(impacting_zone)].", "Your armor has softened hit to your [parse_zone(impacting_zone)].",I.armour_penetration) - apply_damage(total_damage, dtype, impacting_zone, armor) + apply_damage(total_damage, dtype, impacting_zone, armor, sharpness=I.sharpness) if(I.thrownby) log_combat(I.thrownby, src, "threw and hit", I) else diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm index 2a03afb61a..b89f249c80 100644 --- a/code/modules/mob/living/silicon/damage_procs.dm +++ b/code/modules/mob/living/silicon/damage_procs.dm @@ -1,5 +1,5 @@ -/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE) +/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) var/hit_percent = (100-blocked)/100 if(!damage || (!forced && hit_percent <= 0)) return 0 diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 8f103c496e..d50808c92a 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -334,9 +334,11 @@ /obj/item/surgicaldrill, /obj/item/scalpel, /obj/item/circular_saw, + /obj/item/bonesetter, /obj/item/roller/robo, /obj/item/borg/cyborghug/medical, /obj/item/stack/medical/gauze/cyborg, + /obj/item/stack/medical/bone_gel/cyborg, /obj/item/organ_storage, /obj/item/borg/lollipop, /obj/item/sensor_device, diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 5dbf3e8e3b..dc3c90cc64 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -29,8 +29,11 @@ var/armored = FALSE obj_damage = 60 - melee_damage_lower = 20 - melee_damage_upper = 30 + melee_damage_lower = 15 // i know it's like half what it used to be, but bears cause bleeding like crazy now so it works out + melee_damage_upper = 15 + wound_bonus = -5 + bare_wound_bonus = 10 // BEAR wound bonus am i right + sharpness = TRUE attack_verb_continuous = "claws" attack_verb_simple = "claw" attack_sound = 'sound/weapons/bladeslice.ogg' @@ -69,8 +72,9 @@ icon_dead = "combatbear_dead" faction = list("russian") butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/bear = 5, /obj/item/clothing/head/bearpelt = 1, /obj/item/bear_armor = 1) - melee_damage_lower = 25 - melee_damage_upper = 35 + melee_damage_lower = 18 + melee_damage_upper = 20 + wound_bonus = 0 armour_penetration = 20 health = 120 maxHealth = 120 @@ -99,8 +103,9 @@ A.maxHealth += 60 A.health += 60 A.armour_penetration += 20 - A.melee_damage_lower += 5 + A.melee_damage_lower += 3 A.melee_damage_upper += 5 + A.wound_bonus += 5 A.update_icons() to_chat(user, "You strap the armor plating to [A] and sharpen [A.p_their()] claws with the nail filer. This was a great idea.") qdel(src) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index a66ee7b1de..c00d7c3130 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -643,7 +643,7 @@ Difficulty: Normal to_chat(L, "You're struck by a [name]!") var/limb_to_hit = L.get_bodypart(pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) var/armor = L.run_armor_check(limb_to_hit, "melee", "Your armor absorbs [src]!", "Your armor blocks part of [src]!", 50, "Your armor was penetrated by [src]!") - L.apply_damage(damage, BURN, limb_to_hit, armor) + L.apply_damage(damage, BURN, limb_to_hit, armor, wound_bonus=CANT_WOUND) if(ishostile(L)) var/mob/living/simple_animal/hostile/H = L //mobs find and damage you... if(H.stat == CONSCIOUS && !H.target && H.AIStatus != AI_OFF && !H.client) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index 4da8a90b23..78c02fb7a7 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -52,6 +52,8 @@ Difficulty: Medium elimination = 1 appearance_flags = 0 mouse_opacity = MOUSE_OPACITY_ICON + wound_bonus = -40 + bare_wound_bonus = 20 /mob/living/simple_animal/hostile/megafauna/legion/Initialize() . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm index ed189f052d..869f29951b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm @@ -129,7 +129,7 @@ Difficulty: Hard to_chat(L, "[src]'s ground slam shockwave sends you flying!") var/turf/thrownat = get_ranged_target_turf_direct(src, L, 8, rand(-10, 10)) L.throw_at(thrownat, 8, 2, src, TRUE) //, force = MOVE_FORCE_OVERPOWERING, gentle = TRUE) - L.apply_damage(20, BRUTE) + L.apply_damage(20, BRUTE, wound_bonus=CANT_WOUND) shake_camera(L, 2, 1) all_turfs -= T sleep(delay) diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 9a362b680d..4ea8a3c5dc 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -77,6 +77,9 @@ /mob/living/simple_animal/hostile/syndicate/melee melee_damage_lower = 15 melee_damage_upper = 15 + wound_bonus = -10 + bare_wound_bonus = 20 + sharpness = TRUE icon_state = "syndicate_knife" icon_living = "syndicate_knife" loot = list(/obj/effect/gibspawner/human) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 1a646ea73e..1102559aca 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -140,6 +140,13 @@ ///What kind of footstep this mob should have. Null if it shouldn't have any. var/footstep_type + //How much wounding power it has + var/wound_bonus = CANT_WOUND + //How much bare wounding power it has + var/bare_wound_bonus = 0 + //If the attacks from this are sharp + var/sharpness = FALSE + /mob/living/simple_animal/Initialize() . = ..() GLOB.simple_animals[AIStatus] += src diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index ea84e23d01..db2914e620 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -8,6 +8,18 @@ projectile_type = /obj/item/projectile/bullet/shotgun_slug custom_materials = list(/datum/material/iron=4000) +obj/item/ammo_casing/shotgun/executioner + name = "executioner slug" + desc = "A 12 gauge lead slug purpose built to annihilate flesh on impact." + icon_state = "stunshell" + projectile_type = /obj/projectile/bullet/shotgun_slug/executioner + +/obj/item/ammo_casing/shotgun/pulverizer + name = "pulverizer slug" + desc = "A 12 gauge lead slug purpose built to annihilate bones on impact." + icon_state = "stunshell" + projectile_type = /obj/projectile/bullet/shotgun_slug/pulverizer + /obj/item/ammo_casing/shotgun/beanbag name = "beanbag slug" desc = "A weak beanbag slug for riot control." diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm index 174645dd11..5c19edc012 100644 --- a/code/modules/projectiles/ammunition/energy/laser.dm +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -37,6 +37,11 @@ select_name = "anti-vehicle" fire_sound = 'sound/weapons/lasercannonfire.ogg' +/obj/item/ammo_casing/energy/laser/hellfire + projectile_type = /obj/projectile/beam/laser/hellfire + e_cost = 130 + select_name = "maim" + /obj/item/ammo_casing/energy/laser/pulse projectile_type = /obj/item/projectile/beam/pulse e_cost = 200 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index b90f0aee0d..f34343debd 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -184,6 +184,11 @@ return if(target == user && user.zone_selected != BODY_ZONE_PRECISE_MOUTH) //so we can't shoot ourselves (unless mouth selected) return + if(iscarbon(target)) + var/mob/living/carbon/C = target + for(var/datum/wound/W in C.all_wounds) + if(W.try_treating(src, user)) + return // another coward cured! if(istype(user))//Check if the user can use the gun, if the user isn't alive(turrets) assume it can. var/mob/living/L = user diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 72ac9620b5..8e61221cc8 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -44,6 +44,12 @@ ammo_type = list(/obj/item/ammo_casing/energy/lasergun/old) ammo_x_offset = 3 +/obj/item/gun/energy/laser/hellgun + name ="hellfire laser gun" + desc = "A relic of a weapon, built before NT began installing regulators on its laser weaponry. This pattern of laser gun became infamous for the gruesome burn wounds it caused, and was quietly discontinued once it began to affect NT's reputation." + icon_state = "hellgun" + ammo_type = list(/obj/item/ammo_casing/energy/laser/hellfire) + /obj/item/gun/energy/laser/captain name = "antique laser gun" icon_state = "caplaser" diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 7c988ca730..69e3991e39 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -154,6 +154,10 @@ ///If TRUE, hit mobs even if they're on the floor and not our target var/hit_stunned_targets = FALSE + wound_bonus = CANT_WOUND + /// For telling whether we want to roll for bone breaking or lacerations if we're bothering with wounds + var/sharpness = FALSE + /obj/item/projectile/Initialize() . = ..() permutated = list() diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 2f12f0f69b..7147754211 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -14,11 +14,26 @@ ricochets_max = 50 //Honk! ricochet_chance = 80 is_reflectable = TRUE + wound_bonus = -20 + bare_wound_bonus = 10 /obj/item/projectile/beam/laser tracer_type = /obj/effect/projectile/tracer/laser muzzle_type = /obj/effect/projectile/muzzle/laser impact_type = /obj/effect/projectile/impact/laser + wound_bonus = -30 + bare_wound_bonus = 40 + +//overclocked laser, does a bit more damage but has much higher wound power (-0 vs -20) +/obj/projectile/beam/laser/hellfire + name = "hellfire laser" + wound_bonus = 0 + damage = 25 + speed = 0.6 // higher power = faster, that's how light works right + +/obj/projectile/beam/laser/hellfire/Initialize() + . = ..() + transform *= 2 /obj/item/projectile/beam/laser/heavylaser name = "heavy laser" @@ -90,6 +105,7 @@ tracer_type = /obj/effect/projectile/tracer/pulse muzzle_type = /obj/effect/projectile/muzzle/pulse impact_type = /obj/effect/projectile/impact/pulse + wound_bonus = 10 /obj/item/projectile/beam/pulse/on_hit(atom/target, blocked = FALSE) . = ..() @@ -116,6 +132,8 @@ damage = 30 impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser light_color = LIGHT_COLOR_GREEN + wound_bonus = -40 + bare_wound_bonus = 70 /obj/item/projectile/beam/emitter/singularity_pull() return diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 6d03012315..6a081f9b03 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -8,3 +8,4 @@ flag = "bullet" hitsound_wall = "ricochet" impact_effect_type = /obj/effect/temp_visual/impact_effect + sharpness = TRUE \ No newline at end of file diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm index 5643804ac1..c793e9f95e 100644 --- a/code/modules/projectiles/projectile/bullets/revolver.dm +++ b/code/modules/projectiles/projectile/bullets/revolver.dm @@ -19,6 +19,8 @@ ricochet_chance = 50 ricochet_auto_aim_angle = 10 ricochet_auto_aim_range = 3 + wound_bonus = -35 + sharpness = TRUE /obj/item/projectile/bullet/c38/match name = ".38 Match bullet" @@ -29,6 +31,7 @@ ricochet_incidence_leeway = 50 ricochet_decay_chance = 1 ricochet_decay_damage = 1 + wound_bonus = 0 /obj/item/projectile/bullet/c38/match/bouncy name = ".38 Rubber bullet" diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index 264df22c76..b268877451 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -2,10 +2,22 @@ name = "12g shotgun slug" damage = 60 +/obj/projectile/bullet/shotgun_slug/executioner + name = "executioner slug" // admin only, can dismember limbs + sharpness = TRUE + wound_bonus = 0 + +/obj/projectile/bullet/shotgun_slug/pulverizer + name = "pulverizer slug" // admin only, can crush bones + sharpness = FALSE + wound_bonus = 0 + /obj/item/projectile/bullet/shotgun_beanbag name = "beanbag slug" - damage = 5 + damage = 10 stamina = 70 + wound_bonus = 20 + sharpness = FALSE /obj/item/projectile/bullet/incendiary/shotgun name = "incendiary slug" @@ -77,6 +89,7 @@ /obj/item/projectile/bullet/pellet/shotgun_buckshot name = "buckshot pellet" damage = 12.5 + wound_bonus = -10 /obj/item/projectile/bullet/pellet/shotgun_rubbershot name = "rubbershot pellet" diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index b9da8271ab..050b1f29b5 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -144,6 +144,9 @@ M.adjustFireLoss(-power, 0) M.adjustToxLoss(-power, 0, TRUE) //heals TOXINLOVERs M.adjustCloneLoss(-power, 0) + for(var/i in M.all_wounds) + var/datum/wound/W = i + W.on_xadone(power) REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) //fixes common causes for disfiguration . = 1 metabolization_rate = REAGENTS_METABOLISM * (0.00001 * (M.bodytemperature ** 2) + 0.5) @@ -192,6 +195,9 @@ M.adjustFireLoss(-1.5 * power, 0) M.adjustToxLoss(-power, 0, TRUE) M.adjustCloneLoss(-power, 0) + for(var/i in M.all_wounds) + var/datum/wound/W = i + W.on_xadone(power) REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) . = 1 ..() @@ -231,7 +237,7 @@ /datum/reagent/medicine/spaceacillin name = "Spaceacillin" - description = "Spaceacillin will prevent a patient from conventionally spreading any diseases they are currently infected with." + description = "Spaceacillin will prevent a patient from conventionally spreading any diseases they are currently infected with. Also reduces infection in serious burns." color = "#f2f2f2" metabolization_rate = 0.1 * REAGENTS_METABOLISM pH = 8.1 @@ -403,7 +409,7 @@ /datum/reagent/medicine/mine_salve name = "Miner's Salve" - description = "A powerful painkiller. Restores bruising and burns in addition to making the patient believe they are fully healed." + description = "A powerful painkiller. Restores bruising and burns in addition to making the patient believe they are fully healed. Also great for treating severe burn wounds in a pinch." reagent_state = LIQUID color = "#6D6374" metabolization_rate = 0.4 * REAGENTS_METABOLISM @@ -432,7 +438,7 @@ // +10% success propability on each step, useful while operating in less-than-perfect conditions if(show_message) - to_chat(M, "You feel your wounds fade away to nothing!" ) + to_chat(M, "You feel your injuries fade away to nothing!" ) ..() /datum/reagent/medicine/mine_salve/on_mob_end_metabolize(mob/living/M) @@ -453,10 +459,10 @@ /datum/reagent/medicine/synthflesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(iscarbon(M)) - if (M.stat == DEAD) + var/mob/living/carbon/C = M + if(M.stat == DEAD) show_message = 0 if(method in list(INGEST, VAPOR)) - var/mob/living/carbon/C = M C.losebreath++ C.emote("cough") to_chat(M, "You feel your throat closing up!") @@ -465,6 +471,8 @@ else if(method in list(PATCH, TOUCH)) M.adjustBruteLoss(-1 * reac_volume) M.adjustFireLoss(-1 * reac_volume) + for(var/datum/wound/burn/burn_wound in C.all_wounds) + burn_wound.regenerate_flesh(reac_volume) if(show_message) to_chat(M, "You feel your burns and bruises healing! It stings like hell!") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) @@ -1552,10 +1560,6 @@ /datum/reagent/medicine/polypyr/on_mob_life(mob/living/carbon/M) //I wanted a collection of small positive effects, this is as hard to obtain as coniine after all. M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -0.25) M.adjustBruteLoss(-0.35, 0) - if(prob(50)) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - H.bleed_rate = max(H.bleed_rate - 1, 0) ..() . = 1 @@ -1588,3 +1592,10 @@ to_chat(C, "[pick(GLOB.wisdoms)]") //give them a random wisdom ..() +// handled in cut wounds process +/datum/reagent/medicine/coagulant + name = "Sanguirite" + description = "A coagulant used to help open cuts clot faster." + reagent_state = LIQUID + color = "#bb2424" + metabolization_rate = 0.25 * REAGENTS_METABOLISM diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 988441fa2b..9dc091b2eb 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2296,3 +2296,36 @@ if(data["blood_DNA"]) S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) +/datum/reagent/determination + name = "Determination" + description = "For when you need to push on a little more. Do NOT allow near plants." + reagent_state = LIQUID + color = "#D2FFFA" + metabolization_rate = 0.75 * REAGENTS_METABOLISM // 5u (WOUND_DETERMINATION_CRITICAL) will last for ~17 ticks + /// Whether we've had at least WOUND_DETERMINATION_SEVERE (2.5u) of determination at any given time. No damage slowdown immunity or indication we're having a second wind if it's just a single moderate wound + var/significant = FALSE + +/datum/reagent/determination/on_mob_end_metabolize(mob/living/carbon/M) + if(significant) + var/stam_crash = 0 + for(var/thing in M.all_wounds) + var/datum/wound/W = thing + stam_crash += (W.severity + 1) * 3 // spike of 3 stam damage per wound severity (moderate = 6, severe = 9, critical = 12) when the determination wears off if it was a combat rush + M.adjustStaminaLoss(stam_crash) + M.remove_status_effect(STATUS_EFFECT_DETERMINED) + ..() + +/datum/reagent/determination/on_mob_life(mob/living/carbon/M) + if(!significant && volume >= WOUND_DETERMINATION_SEVERE) + significant = TRUE + M.apply_status_effect(STATUS_EFFECT_DETERMINED) // in addition to the slight healing, limping cooldowns are divided by 4 during the combat high + + volume = min(volume, WOUND_DETERMINATION_MAX) + + for(var/thing in M.all_wounds) + var/datum/wound/W = thing + var/obj/item/bodypart/wounded_part = W.limb + if(wounded_part) + wounded_part.heal_damage(0.25, 0.25) + M.adjustStaminaLoss(-0.25*REM) // the more wounds, the more stamina regen + ..() diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 02e4a89e1d..a763376caa 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -154,6 +154,11 @@ pH = 12 value = REAGENT_VALUE_RARE +/datum/reagent/toxin/carpotoxin/on_mob_life(mob/living/carbon/M) + . = ..() + for(var/i in M.all_scars) + qdel(i) + /datum/reagent/toxin/zombiepowder name = "Zombie Powder" description = "A strong neurotoxin that puts the subject into a death-like state." @@ -736,22 +741,13 @@ /datum/reagent/toxin/heparin //Based on a real-life anticoagulant. I'm not a doctor, so this won't be realistic. name = "Heparin" - description = "A powerful anticoagulant. Victims will bleed uncontrollably and suffer scaling bruising." + description = "A powerful anticoagulant. All open cut wounds on the victim will open up and bleed much faster" reagent_state = LIQUID color = "#C8C8C8" //RGB: 200, 200, 200 metabolization_rate = 0.2 * REAGENTS_METABOLISM toxpwr = 0 value = REAGENT_VALUE_VERY_RARE -/datum/reagent/toxin/heparin/on_mob_life(mob/living/carbon/M) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - H.bleed_rate = min(H.bleed_rate + 2, 8) - H.adjustBruteLoss(1, 0) //Brute damage increases with the amount they're bleeding - . = 1 - return ..() || . - - /datum/reagent/toxin/rotatium //Rotatium. Fucks up your rotation and is hilarious name = "Rotatium" description = "A constantly swirling, oddly colourful fluid. Causes the consumer's sense of direction and hand-eye coordination to become wild." diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 799a6db9f5..35f5ebd46e 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -90,12 +90,12 @@ item_state = "medipen" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - amount_per_transfer_from_this = 13 - volume = 13 + amount_per_transfer_from_this = 15 + volume = 15 ignore_flags = 1 //so you can medipen through hardsuits reagent_flags = DRAWABLE flags_1 = null - list_reagents = list(/datum/reagent/medicine/epinephrine = 10, /datum/reagent/preservahyde = 3) + list_reagents = list(/datum/reagent/medicine/epinephrine = 10, /datum/reagent/preservahyde = 3, /datum/reagent/medicine/coagulant = 2) custom_premium_price = PRICE_ALMOST_EXPENSIVE /obj/item/reagent_containers/hypospray/medipen/suicide_act(mob/living/carbon/user) @@ -133,6 +133,13 @@ else . += "It is spent." +/obj/item/reagent_containers/hypospray/medipen/ekit + name = "emergency first-aid autoinjector" + desc = "An epinephrine medipen with trace amounts of coagulants and antibiotics to help stabilize bad cuts and burns." + volume = 15 + amount_per_transfer_from_this = 15 + list_reagents = list(/datum/reagent/medicine/epinephrine = 12, /datum/reagent/medicine/coagulant = 2.5, /datum/reagent/medicine/spaceacillin = 0.5) + /obj/item/reagent_containers/hypospray/medipen/stimulants name = "illegal stimpack medipen" desc = "A highly illegal medipen due to its load and small injections, allow for five uses before being drained" diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm index 76ec6224b8..574c7c9282 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm @@ -119,6 +119,24 @@ category = list("initial", "Medical","Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE +/datum/design/bonesetter + name = "Bonesetter" + id = "bonesetter" + build_type = AUTOLATHE | PROTOLATHE + materials = list(/datum/material/iron = 1000) + build_path = /obj/item/bonesetter + category = list("initial", "Medical", "Tool Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/sticky_tape/surgical + name = "Surgical Tape" + id = "surgical_tape" + build_type = PROTOLATHE + materials = list(/datum/material/plastic = 500) + build_path = /obj/item/stack/sticky_tape/surgical + category = list("initial", "Medical") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + /datum/design/beaker name = "Beaker" id = "beaker" diff --git a/code/modules/research/techweb/nodes/medical_nodes.dm b/code/modules/research/techweb/nodes/medical_nodes.dm index 71dd7c943c..3a9e654b81 100644 --- a/code/modules/research/techweb/nodes/medical_nodes.dm +++ b/code/modules/research/techweb/nodes/medical_nodes.dm @@ -104,7 +104,7 @@ display_name = "Advanced Surgery Tools" description = "Refined and improved redesigns for the run-of-the-mill medical utensils." prereq_ids = list("adv_biotech", "adv_surgery") - design_ids = list("drapes", "retractor_adv", "surgicaldrill_adv", "scalpel_adv") + design_ids = list("drapes", "retractor_adv", "surgicaldrill_adv", "scalpel_adv", "bonesetter", "surgical_tape") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) /datum/techweb_node/adv_surgery diff --git a/code/modules/spells/spell_types/bloodcrawl.dm b/code/modules/spells/spell_types/bloodcrawl.dm index e59fc2049d..39b0f1709e 100644 --- a/code/modules/spells/spell_types/bloodcrawl.dm +++ b/code/modules/spells/spell_types/bloodcrawl.dm @@ -25,6 +25,11 @@ /obj/effect/proc_holder/spell/bloodcrawl/perform(obj/effect/decal/cleanable/target, recharge = 1, mob/living/user = usr) if(istype(user)) + if(istype(user, /mob/living/simple_animal/slaughter)) + var/mob/living/simple_animal/slaughter/slaught = user + slaught.current_hitstreak = 0 + slaught.wound_bonus = initial(slaught.wound_bonus) + slaught.bare_wound_bonus = initial(slaught.bare_wound_bonus) if(phased) if(user.phasein(target)) phased = 0 diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm index a8f9c8bce5..e513865246 100644 --- a/code/modules/spells/spell_types/shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift.dm @@ -105,7 +105,7 @@ var/damage_percent = (stored.maxHealth - stored.health)/stored.maxHealth; var/damapply = damage_percent * shape.maxHealth; - shape.apply_damage(damapply, source.convert_damage_type, forced = TRUE); + shape.apply_damage(damapply, source.convert_damage_type, forced = TRUE, wound_bonus=CANT_WOUND); slink = soullink(/datum/soullink/shapeshift, stored , shape) slink.source = src @@ -158,7 +158,7 @@ var/damage_percent = (shape.maxHealth - shape.health)/shape.maxHealth; var/damapply = stored.maxHealth * damage_percent - stored.apply_damage(damapply, source.convert_damage_type, forced = TRUE) + stored.apply_damage(damapply, source.convert_damage_type, forced = TRUE, wound_bonus=CANT_WOUND) qdel(shape) qdel(src) diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm similarity index 72% rename from code/modules/surgery/bodyparts/bodyparts.dm rename to code/modules/surgery/bodyparts/_bodyparts.dm index fcdb07ca17..711f90a629 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -71,6 +71,28 @@ var/medium_burn_msg = "blistered" var/heavy_burn_msg = "peeling away" + /// The wounds currently afflicting this body part + var/list/wounds + + /// The scars currently afflicting this body part + var/list/scars + /// Our current stored wound damage multiplier + var/wound_damage_multiplier = 1 + + /// This number is subtracted from all wound rolls on this bodypart, higher numbers mean more defense, negative means easier to wound + var/wound_resistance = 0 + /// When this bodypart hits max damage, this number is added to all wound rolls. Obviously only relevant for bodyparts that have damage caps. + var/disabled_wound_penalty = 15 + + /// A hat won't cover your face, but a shirt covering your chest will cover your... you know, chest + var/scars_covered_by_clothes = TRUE + /// Descriptions for the locations on the limb for scars to be assigned, just cosmetic + var/list/specific_locations = list("general area") + /// So we know if we need to scream if this limb hits max damage + var/last_maxed + /// How much generic bleedstacks we have on this bodypart + var/generic_bleedstacks + /obj/item/bodypart/examine(mob/user) . = ..() if(brute_dam > DAMAGE_PRECISION) @@ -149,7 +171,7 @@ //Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all. //Damage will not exceed max_damage using this proc //Cannot apply negative damage -/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE) +/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, stamina = 0, blocked = 0, updating_health = TRUE, required_status = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) // maybe separate BRUTE_SHARP and BRUTE_OTHER eventually somehow hmm if(owner && (owner.status_flags & GODMODE)) return FALSE //godmode var/dmg_mlt = CONFIG_GET(number/damage_multiplier) @@ -163,20 +185,38 @@ if(!brute && !burn && !stamina) return FALSE + brute *= wound_damage_multiplier + burn *= wound_damage_multiplier + switch(animal_origin) if(ALIEN_BODYPART,LARVA_BODYPART) //aliens take some additional burn //nothing can burn with so much snowflake code around burn *= 1.2 + var/wounding_type = (brute > burn ? WOUND_BRUTE : WOUND_BURN) + var/wounding_dmg = max(brute, burn) + if(wounding_type == WOUND_BRUTE && sharpness) + wounding_type = WOUND_SHARP + // i know this is effectively the same check as above but i don't know if those can null the damage by rounding and want to be safe + if(owner && wounding_dmg > 4 && wound_bonus != CANT_WOUND) + // if you want to make tox wounds or some other type, this will need to be expanded and made more modular + // handle all our wounding stuff + check_wounding(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus) + var/can_inflict = max_damage - get_damage() - if(can_inflict <= 0) - return FALSE var/total_damage = brute + burn - if(total_damage > can_inflict) + if(total_damage > can_inflict && total_damage > 0) // TODO: the second part of this check should be removed once disabling is all done brute = round(brute * (max_damage / total_damage),DAMAGE_PRECISION) burn = round(burn * (max_damage / total_damage),DAMAGE_PRECISION) + if(can_inflict <= 0) + return FALSE + + for(var/i in wounds) + var/datum/wound/W = i + W.receive_damage(wounding_type, wounding_dmg, wound_bonus) + brute_dam += brute burn_dam += burn @@ -196,6 +236,107 @@ update_disabled() return update_bodypart_damage_state() +/** + * check_wounding() is where we handle rolling for, selecting, and applying a wound if we meet the criteria + * + * We generate a "score" for how woundable the attack was based on the damage and other factors discussed in [check_wounding_mods()], then go down the list from most severe to least severe wounds in that category. + * We can promote a wound from a lesser to a higher severity this way, but we give up if we have a wound of the given type and fail to roll a higher severity, so no sidegrades/downgrades + * + * Arguments: + * * woundtype- Either WOUND_SHARP, WOUND_BRUTE, or WOUND_BURN based on the attack type. + * * damage- How much damage is tied to this attack, since wounding potential scales with damage in an attack (see: WOUND_DAMAGE_EXPONENT) + * * wound_bonus- The wound_bonus of an attack + * * bare_wound_bonus- The bare_wound_bonus of an attack + */ +/obj/item/bodypart/proc/check_wounding(woundtype, damage, wound_bonus, bare_wound_bonus) + // actually roll wounds if applicable + if(HAS_TRAIT(owner, TRAIT_EASYLIMBDISABLE)) + damage *= 1.5 + + var/base_roll = rand(1, round(damage ** WOUND_DAMAGE_EXPONENT)) + var/injury_roll = base_roll + injury_roll += check_woundings_mods(woundtype, damage, wound_bonus, bare_wound_bonus) + var/list/wounds_checking + + switch(woundtype) + if(WOUND_SHARP) + wounds_checking = WOUND_LIST_CUT + if(WOUND_BRUTE) + wounds_checking = WOUND_LIST_BONE + if(WOUND_BURN) + wounds_checking = WOUND_LIST_BURN + + //cycle through the wounds of the relevant category from the most severe down + for(var/PW in wounds_checking) + var/datum/wound/possible_wound = PW + var/datum/wound/replaced_wound + for(var/i in wounds) + var/datum/wound/existing_wound = i + if(existing_wound.type in wounds_checking) + if(existing_wound.severity >= initial(possible_wound.severity)) + return + else + replaced_wound = existing_wound + + if(initial(possible_wound.threshold_minimum) < injury_roll) + if(replaced_wound) + var/datum/wound/new_wound = replaced_wound.replace_wound(possible_wound) + log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll) + else + var/datum/wound/new_wound = new possible_wound + new_wound.apply_wound(src) + log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll) + return + +// try forcing a specific wound, but only if there isn't already a wound of that severity or greater for that type on this bodypart +/obj/item/bodypart/proc/force_wound_upwards(specific_woundtype, smited = FALSE) + var/datum/wound/potential_wound = specific_woundtype + for(var/i in wounds) + var/datum/wound/existing_wound = i + if(existing_wound.type in (initial(potential_wound.wound_type))) + if(existing_wound.severity < initial(potential_wound.severity)) // we only try if the existing one is inferior to the one we're trying to force + existing_wound.replace_wound(potential_wound, smited) + return + + var/datum/wound/new_wound = new potential_wound + new_wound.apply_wound(src, smited = smited) + +/obj/item/bodypart/proc/check_woundings_mods(wounding_type, damage, wound_bonus, bare_wound_bonus) + var/armor_ablation = 0 + var/injury_mod = 0 + + //var/bwb = 0 + + if(owner && ishuman(owner)) + var/mob/living/carbon/human/H = owner + var/list/clothing = H.clothingonpart(src) + for(var/c in clothing) + var/obj/item/clothing/C = c + // unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary + armor_ablation += C.armor.getRating("wound") + if(wounding_type == WOUND_SHARP) + C.take_damage_zone(body_zone, damage, BRUTE, armour_penetration) + else if(wounding_type == WOUND_BURN && damage >= 10) // lazy way to block freezing from shredding clothes without adding another var onto apply_damage() + C.take_damage_zone(body_zone, damage, BURN, armour_penetration) + + if(!armor_ablation) + injury_mod += bare_wound_bonus + + injury_mod -= armor_ablation + injury_mod += wound_bonus + + for(var/thing in wounds) + var/datum/wound/W = thing + injury_mod += W.threshold_penalty + + var/part_mod = -wound_resistance + if(is_disabled()) + part_mod += disabled_wound_penalty + + injury_mod += part_mod + + return injury_mod + //Heals brute and burn damage for the organ. Returns 1 if the damage-icon states changed at all. //Damage cannot go below zero. //Cannot remove negative damage (i.e. apply damage) @@ -227,16 +368,29 @@ //Checks disabled status thresholds /obj/item/bodypart/proc/update_disabled() + if(!owner) + return set_disabled(is_disabled()) /obj/item/bodypart/proc/is_disabled() + if(!owner) + return if(HAS_TRAIT(owner, TRAIT_PARALYSIS)) return BODYPART_DISABLED_PARALYSIS + for(var/i in wounds) + var/datum/wound/W = i + if(W.disabling) + return BODYPART_DISABLED_WOUND if(can_dismember() && !HAS_TRAIT(owner, TRAIT_NODISMEMBER)) . = disabled //inertia, to avoid limbs healing 0.1 damage and being re-enabled if((get_damage(TRUE) >= max_damage) || (HAS_TRAIT(owner, TRAIT_EASYLIMBDISABLE) && (get_damage(TRUE) >= (max_damage * 0.6)))) //Easy limb disable disables the limb at 40% health instead of 0% - return BODYPART_DISABLED_DAMAGE - if(disabled && (get_damage(TRUE) <= (max_damage * 0.5))) + if(!last_maxed) + owner.emote("scream") + last_maxed = TRUE + if(!is_organic_limb()) + return BODYPART_DISABLED_DAMAGE + else if(disabled && (get_damage(TRUE) <= (max_damage * 0.8))) // reenabled at 80% now instead of 50% as of wounds update + last_maxed = FALSE return BODYPART_NOT_DISABLED else return BODYPART_NOT_DISABLED @@ -251,9 +405,11 @@ /obj/item/bodypart/proc/set_disabled(new_disabled) - if(disabled == new_disabled) + if(disabled == new_disabled || !owner) return FALSE disabled = new_disabled + if(disabled && owner.get_item_for_held_index(held_index)) + owner.dropItemToGround(owner.get_item_for_held_index(held_index)) owner.update_health_hud() //update the healthdoll owner.update_body() owner.update_mobility() @@ -581,293 +737,41 @@ drop_organs() qdel(src) -/obj/item/bodypart/chest - name = BODY_ZONE_CHEST - desc = "It's impolite to stare at a person's chest." - icon_state = "default_human_chest" - max_damage = 200 - body_zone = BODY_ZONE_CHEST - body_part = CHEST - px_x = 0 - px_y = 0 - stam_damage_coeff = 1 - max_stamina_damage = 200 - var/obj/item/cavity_item - -/obj/item/bodypart/chest/can_dismember(obj/item/I) - if(!((owner.stat == DEAD) || owner.InFullCritical())) - return FALSE - return ..() - -/obj/item/bodypart/chest/Destroy() - if(cavity_item) - qdel(cavity_item) - return ..() - -/obj/item/bodypart/chest/drop_organs(mob/user) - if(cavity_item) - cavity_item.forceMove(user.loc) - cavity_item = null - ..() - -/obj/item/bodypart/chest/monkey - icon = 'icons/mob/animal_parts.dmi' - icon_state = "default_monkey_chest" - animal_origin = MONKEY_BODYPART - -/obj/item/bodypart/chest/alien - icon = 'icons/mob/animal_parts.dmi' - icon_state = "alien_chest" - dismemberable = 0 - max_damage = 500 - animal_origin = ALIEN_BODYPART - -/obj/item/bodypart/chest/devil - dismemberable = 0 - max_damage = 5000 - animal_origin = DEVIL_BODYPART - -/obj/item/bodypart/chest/larva - icon = 'icons/mob/animal_parts.dmi' - icon_state = "larva_chest" - dismemberable = 0 - max_damage = 50 - animal_origin = LARVA_BODYPART - -/obj/item/bodypart/l_arm - name = "left arm" - desc = "Did you know that the word 'sinister' stems originally from the \ - Latin 'sinestra' (left hand), because the left hand was supposed to \ - be possessed by the devil? This arm appears to be possessed by no \ - one though." - icon_state = "default_human_l_arm" - attack_verb = list("slapped", "punched") - max_damage = 50 - max_stamina_damage = 50 - body_zone = BODY_ZONE_L_ARM - body_part = ARM_LEFT - aux_icons = list(BODY_ZONE_PRECISE_L_HAND = HANDS_PART_LAYER, "l_hand_behind" = BODY_BEHIND_LAYER) - body_damage_coeff = 0.75 - held_index = 1 - px_x = -6 - px_y = 0 - stam_heal_tick = STAM_RECOVERY_LIMB - -/obj/item/bodypart/l_arm/is_disabled() - if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_ARM)) - return BODYPART_DISABLED_PARALYSIS - return ..() - -/obj/item/bodypart/l_arm/set_disabled(new_disabled) - . = ..() - if(!.) +/// Get whatever wound of the given type is currently attached to this limb, if any +/obj/item/bodypart/proc/get_wound_type(checking_type) + if(isnull(wounds)) return - if(owner.stat < UNCONSCIOUS) - switch(disabled) - if(BODYPART_DISABLED_DAMAGE) - owner.emote("scream") - to_chat(owner, "Your [name] is too damaged to function!") - if(BODYPART_DISABLED_PARALYSIS) - to_chat(owner, "You can't feel your [name]!") - if(held_index) - owner.dropItemToGround(owner.get_item_for_held_index(held_index)) - if(owner.hud_used) - var/obj/screen/inventory/hand/L = owner.hud_used.hand_slots["[held_index]"] - if(L) - L.update_icon() + for(var/thing in wounds) + var/datum/wound/W = thing + if(istype(W, checking_type)) + return W -/obj/item/bodypart/l_arm/monkey - icon = 'icons/mob/animal_parts.dmi' - icon_state = "default_monkey_l_arm" - animal_origin = MONKEY_BODYPART - px_x = -5 - px_y = -3 +/// very rough start for updating efficiency and other stats on a body part whenever a wound is gained/lost +/obj/item/bodypart/proc/update_wounds() + var/dam_mul = 1 //initial(wound_damage_multiplier) + // we can only have one wound per type, but remember there's multiple types + for(var/datum/wound/W in wounds) + dam_mul *= W.damage_mulitplier_penalty + wound_damage_multiplier = dam_mul + update_disabled() -/obj/item/bodypart/l_arm/alien - icon = 'icons/mob/animal_parts.dmi' - icon_state = "alien_l_arm" - px_x = 0 - px_y = 0 - dismemberable = 0 - max_damage = 100 - animal_origin = ALIEN_BODYPART - -/obj/item/bodypart/l_arm/devil - dismemberable = 0 - max_damage = 5000 - animal_origin = DEVIL_BODYPART - -/obj/item/bodypart/r_arm - name = "right arm" - desc = "Over 87% of humans are right handed. That figure is much lower \ - among humans missing their right arm." - icon_state = "default_human_r_arm" - attack_verb = list("slapped", "punched") - max_damage = 50 - body_zone = BODY_ZONE_R_ARM - body_part = ARM_RIGHT - aux_icons = list(BODY_ZONE_PRECISE_R_HAND = HANDS_PART_LAYER, "r_hand_behind" = BODY_BEHIND_LAYER) - body_damage_coeff = 0.75 - held_index = 2 - px_x = 6 - px_y = 0 - stam_heal_tick = STAM_RECOVERY_LIMB - max_stamina_damage = 50 - -/obj/item/bodypart/r_arm/is_disabled() - if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_ARM)) - return BODYPART_DISABLED_PARALYSIS - return ..() - -/obj/item/bodypart/r_arm/set_disabled(new_disabled) - . = ..() - if(!.) +/obj/item/bodypart/proc/get_bleed_rate() + if(status != BODYPART_ORGANIC) // maybe in the future we can bleed oil from aug parts, but not now return - if(owner.stat < UNCONSCIOUS) - switch(disabled) - if(BODYPART_DISABLED_DAMAGE) - owner.emote("scream") - to_chat(owner, "Your [name] is too damaged to function!") - if(BODYPART_DISABLED_PARALYSIS) - to_chat(owner, "You can't feel your [name]!") - if(held_index) - owner.dropItemToGround(owner.get_item_for_held_index(held_index)) - if(owner.hud_used) - var/obj/screen/inventory/hand/R = owner.hud_used.hand_slots["[held_index]"] - if(R) - R.update_icon() + var/bleed_rate = 0 + if(generic_bleedstacks > 0) + bleed_rate++ + if(brute_dam >= 40) + bleed_rate += (brute_dam * 0.008) + //We want an accurate reading of .len + listclearnulls(embedded_objects) + for(var/obj/item/embeddies in embedded_objects) + if(!embeddies.isEmbedHarmless()) + bleed_rate += 0.5 -/obj/item/bodypart/r_arm/monkey - icon = 'icons/mob/animal_parts.dmi' - icon_state = "default_monkey_r_arm" - animal_origin = MONKEY_BODYPART - px_x = 5 - px_y = -3 + for(var/thing in wounds) + var/datum/wound/W = thing + bleed_rate += W.blood_flow -/obj/item/bodypart/r_arm/alien - icon = 'icons/mob/animal_parts.dmi' - icon_state = "alien_r_arm" - px_x = 0 - px_y = 0 - dismemberable = 0 - max_damage = 100 - animal_origin = ALIEN_BODYPART - -/obj/item/bodypart/r_arm/devil - dismemberable = 0 - max_damage = 5000 - animal_origin = DEVIL_BODYPART - -/obj/item/bodypart/l_leg - name = "left leg" - desc = "Some athletes prefer to tie their left shoelaces first for good \ - luck. In this instance, it probably would not have helped." - icon_state = "default_human_l_leg" - attack_verb = list("kicked", "stomped") - max_damage = 50 - body_zone = BODY_ZONE_L_LEG - body_part = LEG_LEFT - body_damage_coeff = 0.75 - px_x = -2 - px_y = 12 - stam_heal_tick = STAM_RECOVERY_LIMB - max_stamina_damage = 50 - -/obj/item/bodypart/l_leg/is_disabled() - if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_LEG)) - return BODYPART_DISABLED_PARALYSIS - return ..() - -/obj/item/bodypart/l_leg/set_disabled(new_disabled) - . = ..() - if(!. || owner.stat >= UNCONSCIOUS) - return - switch(disabled) - if(BODYPART_DISABLED_DAMAGE) - owner.emote("scream") - to_chat(owner, "Your [name] is too damaged to function!") - if(BODYPART_DISABLED_PARALYSIS) - to_chat(owner, "You can't feel your [name]!") - - -/obj/item/bodypart/l_leg/digitigrade - name = "left digitigrade leg" - use_digitigrade = FULL_DIGITIGRADE - -/obj/item/bodypart/l_leg/monkey - icon = 'icons/mob/animal_parts.dmi' - icon_state = "default_monkey_l_leg" - animal_origin = MONKEY_BODYPART - px_y = 4 - -/obj/item/bodypart/l_leg/alien - icon = 'icons/mob/animal_parts.dmi' - icon_state = "alien_l_leg" - px_x = 0 - px_y = 0 - dismemberable = 0 - max_damage = 100 - animal_origin = ALIEN_BODYPART - -/obj/item/bodypart/l_leg/devil - dismemberable = 0 - max_damage = 5000 - animal_origin = DEVIL_BODYPART - -/obj/item/bodypart/r_leg - name = "right leg" - desc = "You put your right leg in, your right leg out. In, out, in, out, \ - shake it all about. And apparently then it detaches.\n\ - The hokey pokey has certainly changed a lot since space colonisation." - // alternative spellings of 'pokey' are availible - icon_state = "default_human_r_leg" - attack_verb = list("kicked", "stomped") - max_damage = 50 - body_zone = BODY_ZONE_R_LEG - body_part = LEG_RIGHT - body_damage_coeff = 0.75 - px_x = 2 - px_y = 12 - max_stamina_damage = 50 - stam_heal_tick = STAM_RECOVERY_LIMB - -/obj/item/bodypart/r_leg/is_disabled() - if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_LEG)) - return BODYPART_DISABLED_PARALYSIS - return ..() - -/obj/item/bodypart/r_leg/set_disabled(new_disabled) - . = ..() - if(!. || owner.stat >= UNCONSCIOUS) - return - switch(disabled) - if(BODYPART_DISABLED_DAMAGE) - owner.emote("scream") - to_chat(owner, "Your [name] is too damaged to function!") - if(BODYPART_DISABLED_PARALYSIS) - to_chat(owner, "You can't feel your [name]!") - -/obj/item/bodypart/r_leg/digitigrade - name = "right digitigrade leg" - use_digitigrade = FULL_DIGITIGRADE - -/obj/item/bodypart/r_leg/monkey - icon = 'icons/mob/animal_parts.dmi' - icon_state = "default_monkey_r_leg" - animal_origin = MONKEY_BODYPART - px_y = 4 - -/obj/item/bodypart/r_leg/alien - icon = 'icons/mob/animal_parts.dmi' - icon_state = "alien_r_leg" - px_x = 0 - px_y = 0 - dismemberable = 0 - max_damage = 100 - animal_origin = ALIEN_BODYPART - -/obj/item/bodypart/r_leg/devil - dismemberable = 0 - max_damage = 5000 - animal_origin = DEVIL_BODYPART + return bleed_rate diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index f654270df7..2ce6ca8862 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -15,7 +15,7 @@ if(HAS_TRAIT(C, TRAIT_NODISMEMBER)) return FALSE var/obj/item/bodypart/affecting = C.get_bodypart(BODY_ZONE_CHEST) - affecting.receive_damage(clamp(brute_dam/2 * affecting.body_damage_coeff, 15, 50), clamp(burn_dam/2 * affecting.body_damage_coeff, 0, 50)) //Damage the chest based on limb's existing damage + affecting.receive_damage(clamp(brute_dam/2 * affecting.body_damage_coeff, 15, 50), clamp(burn_dam/2 * affecting.body_damage_coeff, 0, 50), wound_bonus=CANT_WOUND) //Damage the chest based on limb's existing damage C.visible_message("[C]'s [src.name] has been violently dismembered!") C.emote("scream") SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "dismembered", /datum/mood_event/dismembered) @@ -83,11 +83,12 @@ //limb removal. The "special" argument is used for swapping a limb with a new one without the effects of losing a limb kicking in. -/obj/item/bodypart/proc/drop_limb(special) +/obj/item/bodypart/proc/drop_limb(special, dismembered) if(!owner) return var/atom/Tsec = owner.drop_location() var/mob/living/carbon/C = owner + SEND_SIGNAL(C, COMSIG_CARBON_REMOVE_LIMB, src, dismembered) update_limb(1) C.bodyparts -= src @@ -95,6 +96,15 @@ C.dropItemToGround(owner.get_item_for_held_index(held_index), 1) C.hand_bodyparts[held_index] = null + for(var/thing in scars) + var/datum/scar/S = thing + S.victim = null + LAZYREMOVE(owner.all_scars, S) + + for(var/thing in wounds) + var/datum/wound/W = thing + W.remove_wound(TRUE) + owner = null for(var/X in C.surgeries) //if we had an ongoing surgery on that limb, we stop it. @@ -298,6 +308,15 @@ for(var/obj/item/organ/O in contents) O.Insert(C) + for(var/thing in scars) + var/datum/scar/S = thing + S.victim = C + LAZYADD(C.all_scars, thing) + + for(var/i in wounds) + var/datum/wound/W = i + W.apply_wound(src, TRUE) + update_bodypart_damage_state() update_disabled() diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index a74b1dad28..a67f16b934 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -35,6 +35,10 @@ //If the head is a special sprite var/custom_head + wound_resistance = 10 + specific_locations = list("left eyebrow", "cheekbone", "neck", "throat", "jawline", "entire face") + scars_covered_by_clothes = FALSE + /obj/item/bodypart/head/can_dismember(obj/item/I) if(!((owner.stat == DEAD) || owner.InFullCritical())) return FALSE diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 29aca7166f..3161419449 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -10,6 +10,16 @@ if(L.body_zone == zone) return L +///Get the bodypart for whatever hand we have active, Only relevant for carbons +/mob/proc/get_active_hand() + return FALSE + +/mob/living/carbon/get_active_hand() + var/which_hand = BODY_ZONE_PRECISE_L_HAND + if(!(active_hand_index % 2)) + which_hand = BODY_ZONE_PRECISE_R_HAND + return get_bodypart(check_zone(which_hand)) + /mob/living/carbon/has_hand_for_held_index(i) if(i) var/obj/item/bodypart/L = hand_bodyparts[i] diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm new file mode 100644 index 0000000000..bd4abaa765 --- /dev/null +++ b/code/modules/surgery/bodyparts/parts.dm @@ -0,0 +1,307 @@ + +/obj/item/bodypart/chest + name = BODY_ZONE_CHEST + desc = "It's impolite to stare at a person's chest." + icon_state = "default_human_chest" + max_damage = 200 + body_zone = BODY_ZONE_CHEST + body_part = CHEST + px_x = 0 + px_y = 0 + stam_damage_coeff = 1 + max_stamina_damage = 120 + var/obj/item/cavity_item + specific_locations = list("upper chest", "lower abdomen", "midsection", "collarbone", "lower back") + wound_resistance = 10 + +/obj/item/bodypart/chest/can_dismember(obj/item/I) + if(!((owner.stat == DEAD) || owner.InFullCritical())) + return FALSE + return ..() + +/obj/item/bodypart/chest/Destroy() + QDEL_NULL(cavity_item) + return ..() + +/obj/item/bodypart/chest/drop_organs(mob/user, violent_removal) + if(cavity_item) + cavity_item.forceMove(drop_location()) + cavity_item = null + ..() + +/obj/item/bodypart/chest/monkey + icon = 'icons/mob/animal_parts.dmi' + icon_state = "default_monkey_chest" + animal_origin = MONKEY_BODYPART + wound_resistance = -10 + +/obj/item/bodypart/chest/alien + icon = 'icons/mob/animal_parts.dmi' + icon_state = "alien_chest" + dismemberable = 0 + max_damage = 500 + animal_origin = ALIEN_BODYPART + +/obj/item/bodypart/chest/devil + dismemberable = 0 + max_damage = 5000 + animal_origin = DEVIL_BODYPART + +/obj/item/bodypart/chest/larva + icon = 'icons/mob/animal_parts.dmi' + icon_state = "larva_chest" + dismemberable = 0 + max_damage = 50 + animal_origin = LARVA_BODYPART + +/obj/item/bodypart/l_arm + name = "left arm" + desc = "Did you know that the word 'sinister' stems originally from the \ + Latin 'sinestra' (left hand), because the left hand was supposed to \ + be possessed by the devil? This arm appears to be possessed by no \ + one though." + icon_state = "default_human_l_arm" + attack_verb = list("slapped", "punched") + max_damage = 50 + max_stamina_damage = 50 + body_zone = BODY_ZONE_L_ARM + body_part = ARM_LEFT + aux_zone = BODY_ZONE_PRECISE_L_HAND + aux_layer = HANDS_PART_LAYER + body_damage_coeff = 0.75 + held_index = 1 + px_x = -6 + px_y = 0 + specific_locations = list("outer left forearm", "inner left wrist", "left elbow", "left bicep", "left shoulder") + +/obj/item/bodypart/l_arm/is_disabled() + if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_ARM)) + return BODYPART_DISABLED_PARALYSIS + return ..() + +/obj/item/bodypart/l_arm/set_disabled(new_disabled) + . = ..() + if(!.) + return + if(disabled == BODYPART_DISABLED_DAMAGE) + if(owner.stat < UNCONSCIOUS) + owner.emote("scream") + if(owner.stat < DEAD) + to_chat(owner, "Your [name] is too damaged to function!") + if(held_index) + owner.dropItemToGround(owner.get_item_for_held_index(held_index)) + else if(disabled == BODYPART_DISABLED_PARALYSIS) + if(owner.stat < DEAD) + to_chat(owner, "You can't feel your [name]!") + if(held_index) + owner.dropItemToGround(owner.get_item_for_held_index(held_index)) + if(owner.hud_used) + var/obj/screen/inventory/hand/L = owner.hud_used.hand_slots["[held_index]"] + if(L) + L.update_icon() + +/obj/item/bodypart/l_arm/monkey + icon = 'icons/mob/animal_parts.dmi' + icon_state = "default_monkey_l_arm" + animal_origin = MONKEY_BODYPART + wound_resistance = -10 + px_x = -5 + px_y = -3 + +/obj/item/bodypart/l_arm/alien + icon = 'icons/mob/animal_parts.dmi' + icon_state = "alien_l_arm" + px_x = 0 + px_y = 0 + dismemberable = 0 + max_damage = 100 + animal_origin = ALIEN_BODYPART + +/obj/item/bodypart/l_arm/devil + dismemberable = 0 + max_damage = 5000 + animal_origin = DEVIL_BODYPART + +/obj/item/bodypart/r_arm + name = "right arm" + desc = "Over 87% of humans are right handed. That figure is much lower \ + among humans missing their right arm." + icon_state = "default_human_r_arm" + attack_verb = list("slapped", "punched") + max_damage = 50 + body_zone = BODY_ZONE_R_ARM + body_part = ARM_RIGHT + aux_zone = BODY_ZONE_PRECISE_R_HAND + aux_layer = HANDS_PART_LAYER + body_damage_coeff = 0.75 + held_index = 2 + px_x = 6 + px_y = 0 + max_stamina_damage = 50 + specific_locations = list("outer right forearm", "inner right wrist", "right elbow", "right bicep", "right shoulder") + +/obj/item/bodypart/r_arm/is_disabled() + if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_ARM)) + return BODYPART_DISABLED_PARALYSIS + return ..() + +/obj/item/bodypart/r_arm/set_disabled(new_disabled) + . = ..() + if(!.) + return + if(disabled == BODYPART_DISABLED_DAMAGE) + if(owner.stat < UNCONSCIOUS) + owner.emote("scream") + if(owner.stat < DEAD) + to_chat(owner, "Your [name] is too damaged to function!") + if(held_index) + owner.dropItemToGround(owner.get_item_for_held_index(held_index)) + else if(disabled == BODYPART_DISABLED_PARALYSIS) + if(owner.stat < DEAD) + to_chat(owner, "You can't feel your [name]!") + if(held_index) + owner.dropItemToGround(owner.get_item_for_held_index(held_index)) + if(owner.hud_used) + var/obj/screen/inventory/hand/R = owner.hud_used.hand_slots["[held_index]"] + if(R) + R.update_icon() + +/obj/item/bodypart/r_arm/monkey + icon = 'icons/mob/animal_parts.dmi' + icon_state = "default_monkey_r_arm" + animal_origin = MONKEY_BODYPART + wound_resistance = -10 + px_x = 5 + px_y = -3 + +/obj/item/bodypart/r_arm/alien + icon = 'icons/mob/animal_parts.dmi' + icon_state = "alien_r_arm" + px_x = 0 + px_y = 0 + dismemberable = 0 + max_damage = 100 + animal_origin = ALIEN_BODYPART + +/obj/item/bodypart/r_arm/devil + dismemberable = 0 + max_damage = 5000 + animal_origin = DEVIL_BODYPART + +/obj/item/bodypart/l_leg + name = "left leg" + desc = "Some athletes prefer to tie their left shoelaces first for good \ + luck. In this instance, it probably would not have helped." + icon_state = "default_human_l_leg" + attack_verb = list("kicked", "stomped") + max_damage = 50 + body_zone = BODY_ZONE_L_LEG + body_part = LEG_LEFT + body_damage_coeff = 0.75 + px_x = -2 + px_y = 12 + max_stamina_damage = 50 + specific_locations = list("inner left thigh", "outer left calf", "outer left hip", " left kneecap", "lower left shin") + +/obj/item/bodypart/l_leg/is_disabled() + if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_LEG)) + return BODYPART_DISABLED_PARALYSIS + return ..() + +/obj/item/bodypart/l_leg/set_disabled(new_disabled) + . = ..() + if(!.) + return + if(disabled == BODYPART_DISABLED_DAMAGE) + if(owner.stat < UNCONSCIOUS) + owner.emote("scream") + if(owner.stat < DEAD) + to_chat(owner, "Your [name] is too damaged to function!") + else if(disabled == BODYPART_DISABLED_PARALYSIS) + if(owner.stat < DEAD) + to_chat(owner, "You can't feel your [name]!") + +/obj/item/bodypart/l_leg/digitigrade + name = "left digitigrade leg" + use_digitigrade = FULL_DIGITIGRADE + +/obj/item/bodypart/l_leg/monkey + icon = 'icons/mob/animal_parts.dmi' + icon_state = "default_monkey_l_leg" + animal_origin = MONKEY_BODYPART + wound_resistance = -10 + px_y = 4 + +/obj/item/bodypart/l_leg/alien + icon = 'icons/mob/animal_parts.dmi' + icon_state = "alien_l_leg" + px_x = 0 + px_y = 0 + dismemberable = 0 + max_damage = 100 + animal_origin = ALIEN_BODYPART + +/obj/item/bodypart/l_leg/devil + dismemberable = 0 + max_damage = 5000 + animal_origin = DEVIL_BODYPART + +/obj/item/bodypart/r_leg + name = "right leg" + desc = "You put your right leg in, your right leg out. In, out, in, out, \ + shake it all about. And apparently then it detaches.\n\ + The hokey pokey has certainly changed a lot since space colonisation." + // alternative spellings of 'pokey' are availible + icon_state = "default_human_r_leg" + attack_verb = list("kicked", "stomped") + max_damage = 50 + body_zone = BODY_ZONE_R_LEG + body_part = LEG_RIGHT + body_damage_coeff = 0.75 + px_x = 2 + px_y = 12 + max_stamina_damage = 50 + specific_locations = list("inner right thigh", "outer right calf", "outer right hip", "right kneecap", "lower right shin") + +/obj/item/bodypart/r_leg/is_disabled() + if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_LEG)) + return BODYPART_DISABLED_PARALYSIS + return ..() + +/obj/item/bodypart/r_leg/set_disabled(new_disabled) + . = ..() + if(!.) + return + if(disabled == BODYPART_DISABLED_DAMAGE) + if(owner.stat < UNCONSCIOUS) + owner.emote("scream") + if(owner.stat < DEAD) + to_chat(owner, "Your [name] is too damaged to function!") + else if(disabled == BODYPART_DISABLED_PARALYSIS) + if(owner.stat < DEAD) + to_chat(owner, "You can't feel your [name]!") + +/obj/item/bodypart/r_leg/digitigrade + name = "right digitigrade leg" + use_digitigrade = FULL_DIGITIGRADE + +/obj/item/bodypart/r_leg/monkey + icon = 'icons/mob/animal_parts.dmi' + icon_state = "default_monkey_r_leg" + animal_origin = MONKEY_BODYPART + wound_resistance = -10 + px_y = 4 + +/obj/item/bodypart/r_leg/alien + icon = 'icons/mob/animal_parts.dmi' + icon_state = "alien_r_leg" + px_x = 0 + px_y = 0 + dismemberable = 0 + max_damage = 100 + animal_origin = ALIEN_BODYPART + +/obj/item/bodypart/r_leg/devil + dismemberable = 0 + max_damage = 5000 + animal_origin = DEVIL_BODYPART diff --git a/code/modules/surgery/bone_mending.dm b/code/modules/surgery/bone_mending.dm new file mode 100644 index 0000000000..6afe494105 --- /dev/null +++ b/code/modules/surgery/bone_mending.dm @@ -0,0 +1,142 @@ + +/////BONE FIXING SURGERIES////// + +///// Repair Hairline Fracture (Severe) +/datum/surgery/repair_bone_hairline + name = "Repair bone fracture (hairline)" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/repair_bone_hairline, /datum/surgery_step/close) + target_mobtypes = list(/mob/living/carbon/human) + possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) + requires_real_bodypart = TRUE + targetable_wound = /datum/wound/brute/bone/severe + +/datum/surgery/repair_bone_hairline/can_start(mob/living/user, mob/living/carbon/target) + if(..()) + var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) + return(targeted_bodypart.get_wound_type(targetable_wound)) + + +///// Repair Compound Fracture (Critical) +/datum/surgery/repair_bone_compound + name = "Repair Compound Fracture" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/reset_compound_fracture, /datum/surgery_step/repair_bone_compound, /datum/surgery_step/close) + target_mobtypes = list(/mob/living/carbon/human) + possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) + requires_real_bodypart = TRUE + targetable_wound = /datum/wound/brute/bone/critical + +/datum/surgery/repair_bone_compound/can_start(mob/living/user, mob/living/carbon/target) + if(..()) + var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) + return(targeted_bodypart.get_wound_type(targetable_wound)) + + + +//SURGERY STEPS + +///// Repair Hairline Fracture (Severe) +/datum/surgery_step/repair_bone_hairline + name = "repair hairline fracture (bonesetter/bone gel/tape)" + implements = list(/obj/item/bonesetter = 100, /obj/item/stack/medical/bone_gel = 100, /obj/item/stack/sticky_tape/surgical = 100, /obj/item/stack/sticky_tape/super = 50, /obj/item/stack/sticky_tape = 30) + time = 40 + experience_given = MEDICAL_SKILL_MEDIUM + +/datum/surgery_step/repair_bone_hairline/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(surgery.operated_wound) + display_results(user, target, "You begin to repair the fracture in [target]'s [parse_zone(user.zone_selected)]...", + "[user] begins to repair the fracture in [target]'s [parse_zone(user.zone_selected)] with [tool].", + "[user] begins to repair the fracture in [target]'s [parse_zone(user.zone_selected)].") + else + user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...") + +/datum/surgery_step/repair_bone_hairline/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + if(surgery.operated_wound) + if(istype(tool, /obj/item/stack)) + var/obj/item/stack/used_stack = tool + used_stack.use(1) + display_results(user, target, "You successfully repair the fracture in [target]'s [parse_zone(target_zone)].", + "[user] successfully repairs the fracture in [target]'s [parse_zone(target_zone)] with [tool]!", + "[user] successfully repairs the fracture in [target]'s [parse_zone(target_zone)]!") + log_combat(user, target, "repaired a hairline fracture in", addition="INTENT: [uppertext(user.a_intent)]") + qdel(surgery.operated_wound) + else + to_chat(user, "[target] has no hairline fracture there!") + return ..() + +/datum/surgery_step/repair_bone_hairline/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, var/fail_prob = 0) + ..() + if(istype(tool, /obj/item/stack)) + var/obj/item/stack/used_stack = tool + used_stack.use(1) + + + +///// Reset Compound Fracture (Crticial) +/datum/surgery_step/reset_compound_fracture + name = "reset bone" + implements = list(/obj/item/bonesetter = 100, /obj/item/stack/sticky_tape/surgical = 60, /obj/item/stack/sticky_tape/super = 40, /obj/item/stack/sticky_tape = 20) + time = 40 + experience_given = MEDICAL_SKILL_MEDIUM + +/datum/surgery_step/reset_compound_fracture/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(surgery.operated_wound) + display_results(user, target, "You begin to reset the bone in [target]'s [parse_zone(user.zone_selected)]...", + "[user] begins to reset the bone in [target]'s [parse_zone(user.zone_selected)] with [tool].", + "[user] begins to reset the bone in [target]'s [parse_zone(user.zone_selected)].") + else + user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...") + +/datum/surgery_step/reset_compound_fracture/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + if(surgery.operated_wound) + if(istype(tool, /obj/item/stack)) + var/obj/item/stack/used_stack = tool + used_stack.use(1) + display_results(user, target, "You successfully reset the bone in [target]'s [parse_zone(target_zone)].", + "[user] successfully resets the bone in [target]'s [parse_zone(target_zone)] with [tool]!", + "[user] successfully resets the bone in [target]'s [parse_zone(target_zone)]!") + log_combat(user, target, "reset a compound fracture in", addition="INTENT: [uppertext(user.a_intent)]") + else + to_chat(user, "[target] has no compound fracture there!") + return ..() + +/datum/surgery_step/reset_compound_fracture/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, var/fail_prob = 0) + ..() + if(istype(tool, /obj/item/stack)) + var/obj/item/stack/used_stack = tool + used_stack.use(1) + + +///// Repair Compound Fracture (Crticial) +/datum/surgery_step/repair_bone_compound + name = "repair compound fracture (bone gel/tape)" + implements = list(/obj/item/stack/medical/bone_gel = 100, /obj/item/stack/sticky_tape/surgical = 100, /obj/item/stack/sticky_tape/super = 50, /obj/item/stack/sticky_tape = 30) + time = 40 + experience_given = MEDICAL_SKILL_MEDIUM + +/datum/surgery_step/repair_bone_compound/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(surgery.operated_wound) + display_results(user, target, "You begin to repair the fracture in [target]'s [parse_zone(user.zone_selected)]...", + "[user] begins to repair the fracture in [target]'s [parse_zone(user.zone_selected)] with [tool].", + "[user] begins to repair the fracture in [target]'s [parse_zone(user.zone_selected)].") + else + user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...") + +/datum/surgery_step/repair_bone_compound/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + if(surgery.operated_wound) + if(istype(tool, /obj/item/stack)) + var/obj/item/stack/used_stack = tool + used_stack.use(1) + display_results(user, target, "You successfully repair the fracture in [target]'s [parse_zone(target_zone)].", + "[user] successfully repairs the fracture in [target]'s [parse_zone(target_zone)] with [tool]!", + "[user] successfully repairs the fracture in [target]'s [parse_zone(target_zone)]!") + log_combat(user, target, "repaired a compound fracture in", addition="INTENT: [uppertext(user.a_intent)]") + qdel(surgery.operated_wound) + else + to_chat(user, "[target] has no compound fracture there!") + return ..() + +/datum/surgery_step/repair_bone_compound/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, var/fail_prob = 0) + ..() + if(istype(tool, /obj/item/stack)) + var/obj/item/stack/used_stack = tool + used_stack.use(1) diff --git a/code/modules/surgery/burn_dressing.dm b/code/modules/surgery/burn_dressing.dm new file mode 100644 index 0000000000..1d64d29ff6 --- /dev/null +++ b/code/modules/surgery/burn_dressing.dm @@ -0,0 +1,108 @@ + +/////BURN FIXING SURGERIES////// + +///// Debride burnt flesh +/datum/surgery/debride + name = "Debride infected flesh" + steps = list(/datum/surgery_step/debride, /datum/surgery_step/dress) + target_mobtypes = list(/mob/living/carbon/human) + possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) + requires_real_bodypart = TRUE + targetable_wound = /datum/wound/burn + +/datum/surgery/debride/can_start(mob/living/user, mob/living/carbon/target) + if(..()) + var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) + var/datum/wound/burn/burn_wound = targeted_bodypart.get_wound_type(targetable_wound) + return(burn_wound && burn_wound.infestation > 0) + +//SURGERY STEPS + +///// Debride +/datum/surgery_step/debride + name = "excise infection" + implements = list(TOOL_HEMOSTAT = 100, TOOL_SCALPEL = 85, TOOL_SAW = 60, TOOL_WIRECUTTER = 40) + time = 30 + repeatable = TRUE + experience_given = MEDICAL_SKILL_MEDIUM + +/datum/surgery_step/debride/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(surgery.operated_wound) + var/datum/wound/burn/burn_wound = surgery.operated_wound + if(burn_wound.infestation <= 0) + to_chat(user, "[target]'s [parse_zone(user.zone_selected)] has no infected flesh to remove!") + surgery.status++ + repeatable = FALSE + return + display_results(user, target, "You begin to excise infected flesh from [target]'s [parse_zone(user.zone_selected)]...", + "[user] begins to excise infected flesh from [target]'s [parse_zone(user.zone_selected)] with [tool].", + "[user] begins to excise infected flesh from [target]'s [parse_zone(user.zone_selected)].") + else + user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...") + +/datum/surgery_step/debride/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + var/datum/wound/burn/burn_wound = surgery.operated_wound + if(burn_wound) + display_results(user, target, "You successfully excise some of the infected flesh from [target]'s [parse_zone(target_zone)].", + "[user] successfully excises some of the infected flesh from [target]'s [parse_zone(target_zone)] with [tool]!", + "[user] successfully excises some of the infected flesh from [target]'s [parse_zone(target_zone)]!") + log_combat(user, target, "excised infected flesh in", addition="INTENT: [uppertext(user.a_intent)]") + surgery.operated_bodypart.receive_damage(brute=3, wound_bonus=CANT_WOUND) + burn_wound.infestation -= 0.5 + burn_wound.sanitization += 0.5 + if(burn_wound.infestation <= 0) + repeatable = FALSE + else + to_chat(user, "[target] has no infected flesh there!") + return ..() + +/datum/surgery_step/debride/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, var/fail_prob = 0) + ..() + display_results(user, target, "You carve away some of the healthy flesh from [target]'s [parse_zone(target_zone)].", + "[user] carves away some of the healthy flesh from [target]'s [parse_zone(target_zone)] with [tool]!", + "[user] carves away some of the healthy flesh from [target]'s [parse_zone(target_zone)]!") + surgery.operated_bodypart.receive_damage(brute=rand(4,8), sharpness=TRUE) + +/datum/surgery_step/debride/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) + if(!..()) + return + var/datum/wound/burn/burn_wound = surgery.operated_wound + while(burn_wound && burn_wound.infestation > 0.25) + if(!..()) + break + +///// Dressing burns +/datum/surgery_step/dress + name = "bandage burns" + implements = list(/obj/item/stack/medical/gauze = 100, /obj/item/stack/sticky_tape/surgical = 100) + time = 40 + experience_given = MEDICAL_SKILL_MEDIUM + +/datum/surgery_step/dress/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + var/datum/wound/burn/burn_wound = surgery.operated_wound + if(burn_wound) + display_results(user, target, "You begin to dress the burns on [target]'s [parse_zone(user.zone_selected)]...", + "[user] begins to dress the burns on [target]'s [parse_zone(user.zone_selected)] with [tool].", + "[user] begins to dress the burns on [target]'s [parse_zone(user.zone_selected)].") + else + user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "You look for [target]'s [parse_zone(user.zone_selected)]...") + +/datum/surgery_step/dress/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + var/datum/wound/burn/burn_wound = surgery.operated_wound + if(burn_wound) + display_results(user, target, "You successfully wrap [target]'s [parse_zone(target_zone)] with [tool].", + "[user] successfully wraps [target]'s [parse_zone(target_zone)] with [tool]!", + "[user] successfully wraps [target]'s [parse_zone(target_zone)]!") + log_combat(user, target, "dressed burns in", addition="INTENT: [uppertext(user.a_intent)]") + burn_wound.sanitization += 3 + burn_wound.flesh_healing += 5 + burn_wound.force_bandage(tool) + else + to_chat(user, "[target] has no burns there!") + return ..() + +/datum/surgery_step/dress/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, var/fail_prob = 0) + ..() + if(istype(tool, /obj/item/stack)) + var/obj/item/stack/used_stack = tool + used_stack.use(1) diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm index af736e393c..d1d478ddfe 100644 --- a/code/modules/surgery/coronary_bypass.dm +++ b/code/modules/surgery/coronary_bypass.dm @@ -31,7 +31,8 @@ display_results(user, target, "Blood pools around the incision in [H]'s heart.", "Blood pools around the incision in [H]'s heart.", "") - H.bleed_rate += 10 + var/obj/item/bodypart/BP = H.get_bodypart(target_zone) + BP.generic_bleedstacks += 10 H.adjustBruteLoss(10) return TRUE @@ -41,7 +42,8 @@ display_results(user, target, "You screw up, cutting too deeply into the heart!", "[user] screws up, causing blood to spurt out of [H]'s chest!", "[user] screws up, causing blood to spurt out of [H]'s chest!") - H.bleed_rate += 20 + var/obj/item/bodypart/BP = H.get_bodypart(target_zone) + BP.generic_bleedstacks += 10 H.adjustOrganLoss(ORGAN_SLOT_HEART, 10) H.adjustBruteLoss(10) @@ -73,5 +75,6 @@ "[user] screws up, causing blood to spurt out of [H]'s chest profusely!", "[user] screws up, causing blood to spurt out of [H]'s chest profusely!") H.adjustOrganLoss(ORGAN_SLOT_HEART, 20) - H.bleed_rate += 30 + var/obj/item/bodypart/BP = H.get_bodypart(target_zone) + BP.generic_bleedstacks += 30 return FALSE diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm index 6110bb6202..b9d877d0c1 100644 --- a/code/modules/surgery/experimental_dissection.dm +++ b/code/modules/surgery/experimental_dissection.dm @@ -78,7 +78,7 @@ "[user] dissects [target]!") SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = points_earned)) var/obj/item/bodypart/L = target.get_bodypart(BODY_ZONE_CHEST) - target.apply_damage(80, BRUTE, L) + target.apply_damage(80, BRUTE, L, wound_bonus=CANT_WOUND) ADD_TRAIT(target, TRAIT_DISSECTED, "[surgery.name]") repeatable = FALSE return TRUE @@ -89,7 +89,7 @@ "[user] dissects [target], but looks a little dissapointed.") SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = (round(check_value(target, surgery) * 0.01)))) var/obj/item/bodypart/L = target.get_bodypart(BODY_ZONE_CHEST) - target.apply_damage(80, BRUTE, L) + target.apply_damage(80, BRUTE, L, wound_bonus=CANT_WOUND) return TRUE /datum/surgery/advanced/experimental_dissection/adv diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm index 4069199864..0680dda404 100644 --- a/code/modules/surgery/healing.dm +++ b/code/modules/surgery/healing.dm @@ -87,7 +87,7 @@ urdamageamt_brute += round((target.getBruteLoss()/ (missinghpbonus*2)),0.1) urdamageamt_burn += round((target.getFireLoss()/ (missinghpbonus*2)),0.1) - target.take_bodypart_damage(urdamageamt_brute, urdamageamt_burn) + target.take_bodypart_damage(urdamageamt_brute, urdamageamt_burn, wound_bonus=CANT_WOUND) return FALSE /***************************BRUTE***************************/ diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm index 0b38ecc2fe..8e893875a9 100644 --- a/code/modules/surgery/organic_steps.dm +++ b/code/modules/surgery/organic_steps.dm @@ -21,7 +21,9 @@ display_results(user, target, "Blood pools around the incision in [H]'s [parse_zone(target_zone)].", "Blood pools around the incision in [H]'s [parse_zone(target_zone)].", "") - H.bleed_rate += 3 + var/obj/item/bodypart/BP = target.get_bodypart(target_zone) + if(BP) + BP.generic_bleedstacks += 10 return TRUE /datum/surgery_step/incise/nobleed //silly friendly! @@ -50,7 +52,9 @@ target.heal_bodypart_damage(20,0) if (ishuman(target)) var/mob/living/carbon/human/H = target - H.bleed_rate = max( (H.bleed_rate - 3), 0) + var/obj/item/bodypart/BP = H.get_bodypart(target_zone) + if(BP) + BP.generic_bleedstacks -= 3 return ..() //retract skin /datum/surgery_step/retract_skin @@ -86,7 +90,9 @@ target.heal_bodypart_damage(45,0) if (ishuman(target)) var/mob/living/carbon/human/H = target - H.bleed_rate = max( (H.bleed_rate - 3), 0) + var/obj/item/bodypart/BP = H.get_bodypart(target_zone) + if(BP) + BP.generic_bleedstacks -= 3 return ..() //saw bone /datum/surgery_step/saw @@ -100,7 +106,7 @@ "[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].") /datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - target.apply_damage(50, BRUTE, "[target_zone]") + target.apply_damage(50, BRUTE, "[target_zone]", wound_bonus=CANT_WOUND) display_results(user, target, "You saw [target]'s [parse_zone(target_zone)] open.", "[user] saws [target]'s [parse_zone(target_zone)] open!", "[user] saws [target]'s [parse_zone(target_zone)] open!") diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index fa49e3eff5..b6b74efe32 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -318,13 +318,14 @@ cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - L.apply_damage(15 * power_multiplier, def_zone = BODY_ZONE_CHEST) + L.apply_damage(15 * power_multiplier, def_zone = BODY_ZONE_CHEST, wound_bonus=CANT_WOUND) //BLEED else if((findtext(message, bleed_words))) cooldown = COOLDOWN_DAMAGE for(var/mob/living/carbon/human/H in listeners) - H.bleed_rate += (5 * power_multiplier) + var/obj/item/bodypart/BP = pick(H.bodyparts) + BP.generic_bleedstacks += 5 //FIRE else if((findtext(message, burn_words))) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 51ce2726b0..4d42cb6c23 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -18,6 +18,8 @@ var/lying_required = TRUE //Does the vicitm needs to be lying down. var/requires_tech = FALSE var/replaced_by + var/datum/wound/operated_wound //The actual wound datum instance we're targeting + var/datum/wound/targetable_wound //The wound type this surgery targets /datum/surgery/New(surgery_target, surgery_location, surgery_bodypart) ..() @@ -28,8 +30,13 @@ location = surgery_location if(surgery_bodypart) operated_bodypart = surgery_bodypart + if(targetable_wound) + operated_wound = operated_bodypart.get_wound_type(targetable_wound) + operated_wound.attached_surgery = src /datum/surgery/Destroy() + if(operated_wound) + operated_wound.attached_surgery = null if(target) target.surgeries -= src target = null diff --git a/tgstation.dme b/tgstation.dme index 9c1f8a2378..dd57ad97a2 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -654,6 +654,7 @@ #include "code\datums\wires\tesla_coil.dm" #include "code\datums\wires\vending.dm" #include "code\datums\wounds\_scars.dm" +#include "code\datums\wounds\_wounds.dm" #include "code\datums\wounds\cuts.dm" #include "code\game\alternate_appearance.dm" #include "code\game\atoms.dm" @@ -3256,7 +3257,9 @@ #include "code\modules\station_goals\shield.dm" #include "code\modules\station_goals\station_goal.dm" #include "code\modules\surgery\amputation.dm" +#include "code\modules\surgery\bone_mending.dm" #include "code\modules\surgery\brain_surgery.dm" +#include "code\modules\surgery\burn_dressing.dm" #include "code\modules\surgery\cavity_implant.dm" #include "code\modules\surgery\core_removal.dm" #include "code\modules\surgery\coronary_bypass.dm" @@ -3297,10 +3300,11 @@ #include "code\modules\surgery\advanced\bioware\nerve_grounding.dm" #include "code\modules\surgery\advanced\bioware\nerve_splicing.dm" #include "code\modules\surgery\advanced\bioware\vein_threading.dm" -#include "code\modules\surgery\bodyparts\bodyparts.dm" +#include "code\modules\surgery\bodyparts\_bodyparts.dm" #include "code\modules\surgery\bodyparts\dismemberment.dm" #include "code\modules\surgery\bodyparts\head.dm" #include "code\modules\surgery\bodyparts\helpers.dm" +#include "code\modules\surgery\bodyparts\parts.dm" #include "code\modules\surgery\bodyparts\robot_bodyparts.dm" #include "code\modules\surgery\organs\appendix.dm" #include "code\modules\surgery\organs\augments_arms.dm" From 36d25b178a272e50790f514d49c884f6c276ac12 Mon Sep 17 00:00:00 2001 From: CameronWoof Date: Fri, 17 Jul 2020 17:35:15 -0700 Subject: [PATCH 036/122] arcade tickets got lost in the resolution --- icons/obj/stack_objects.dmi | Bin 51133 -> 51987 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi index 9241e7ffd8a099b1cdcf0d72dda9ebae3f79aff0..1cdb3b6443e6ac60f96763f4e87d89b11fbbe4a6 100644 GIT binary patch delta 11924 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 delta 11063 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 Date: Sat, 18 Jul 2020 02:29:12 +0100 Subject: [PATCH 037/122] changes --- code/__DEFINES/dcs/signals.dm | 3 +- code/__DEFINES/mobs.dm | 2 + code/__HELPERS/do_after.dm | 26 +- code/datums/mind.dm | 1 - code/datums/wounds/_wounds.dm | 2 - code/datums/wounds/bones.dm | 453 ++++++++++++++++++ code/datums/wounds/burns.dm | 323 +++++++++++++ code/datums/wounds/cuts.dm | 2 +- code/game/objects/items/grenades/flashbang.dm | 4 +- code/game/objects/items/shrapnel.dm | 4 +- code/game/objects/items/stacks/medical.dm | 6 +- code/game/objects/items/storage/firstaid.dm | 3 +- code/game/objects/items/tanks/tanks.dm | 1 - code/game/objects/structures/tables_racks.dm | 6 +- .../antagonists/bloodsucker/powers/feed.dm | 4 +- .../bloodsucker/powers/recuperate.dm | 5 +- code/modules/clothing/clothing.dm | 4 +- code/modules/clothing/suits/armor.dm | 2 +- .../modules/mob/dead/new_player/new_player.dm | 2 +- code/modules/mob/living/blood.dm | 36 +- code/modules/mob/living/carbon/carbon.dm | 1 - .../mob/living/carbon/carbon_defense.dm | 4 +- .../modules/mob/living/carbon/damage_procs.dm | 8 +- .../mob/living/carbon/human/human_defense.dm | 2 +- code/modules/mob/mob_defines.dm | 3 + .../ammunition/ballistic/shotgun.dm | 4 +- .../projectiles/ammunition/energy/laser.dm | 2 +- code/modules/projectiles/projectile.dm | 2 +- code/modules/projectiles/projectile/beams.dm | 5 +- .../projectiles/projectile/bullets/shotgun.dm | 4 +- code/modules/surgery/bodyparts/parts.dm | 4 - code/modules/surgery/bone_mending.dm | 3 - code/modules/surgery/burn_dressing.dm | 2 - code/modules/vending/_vending.dm | 2 +- tgstation.dme | 2 + 35 files changed, 861 insertions(+), 76 deletions(-) create mode 100644 code/datums/wounds/bones.dm create mode 100644 code/datums/wounds/burns.dm diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 7db67c3072..e9d62a3e1d 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -357,7 +357,7 @@ #define COMSIG_PROJECTILE_SELF_ON_HIT "projectile_self_on_hit" // from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle) #define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" // from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle) #define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire" // from base of /obj/item/projectile/proc/fire(): (obj/item/projectile, atom/original_target) -#define COMSIG_PROJECTILE_FIRE "projectile_fire" ///from the base of /obj/projectile/proc/fire(): () +#define COMSIG_PROJECTILE_FIRE "projectile_fire" ///from the base of /obj/item/projectile/proc/fire(): () #define COMSIG_PROJECTILE_RANGE_OUT "projectile_range_out" // sent to targets during the process_hit proc of projectiles #define COMSIG_EMBED_TRY_FORCE "item_try_embed" // sent when trying to force an embed (mainly for projectiles, only used in the embed element) #define COMSIG_PROJECTILE_PREHIT "com_proj_prehit" ///sent to targets during the process_hit proc of projectiles @@ -367,6 +367,7 @@ // /mob/living/carbon/human signals #define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target) #define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker) +#define COMSIG_HUMAN_EARLY_UNARMED_ATTACK "human_early_unarmed_attack" #define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit" //Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted) #define COMSIG_HUMAN_PREFS_COPIED_TO "human_prefs_copied_to" //from datum/preferences/copy_to(): (datum/preferences, icon_updates, roundstart_checks) #define COMSIG_HUMAN_HARDSET_DNA "human_hardset_dna" //from mob/living/carbon/human/hardset_dna(): (ui, list/mutation_index, newreal_name, newblood_type, datum/species, newfeatures) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index ddb901f24c..52657e9104 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -12,6 +12,8 @@ #define MOVE_INTENT_RUN "run" //Blood levels +#define BLOOD_VOLUME_MAX_LETHAL 2150 +#define BLOOD_VOLUME_EXCESS 2100 #define BLOOD_VOLUME_MAXIMUM 2000 #define BLOOD_VOLUME_SLIME_SPLIT 1120 #define BLOOD_VOLUME_NORMAL 560 diff --git a/code/__HELPERS/do_after.dm b/code/__HELPERS/do_after.dm index f1f483c345..614c3d73c4 100644 --- a/code/__HELPERS/do_after.dm +++ b/code/__HELPERS/do_after.dm @@ -166,6 +166,8 @@ var/target_loc = target.loc + LAZYADD(user.do_afters, target) + var/holding = user.get_active_held_item() var/datum/progressbar/progbar if (progress) @@ -183,6 +185,9 @@ break if(uninterruptible) continue + if(!(target in user.do_afters)) + . = FALSE + break if(drifting && !user.inertia_dir) drifting = 0 @@ -191,9 +196,10 @@ if((!drifting && user.loc != user_loc) || target.loc != target_loc || (!ignorehelditem && user.get_active_held_item() != holding) || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke())) . = 0 break - if (progress) + if(progress) qdel(progbar) - + if(!QDELETED(target)) + LAZYREMOVE(user.do_afters, target) //some additional checks as a callback for for do_afters that want to break on losing health or on the mob taking action /mob/proc/break_do_after_checks(list/checked_health, check_clicks) @@ -216,6 +222,9 @@ if(target && !isturf(target)) Tloc = target.loc + if(target) + LAZYADD(user.do_afters, target) + var/atom/Uloc = user.loc var/drifting = 0 @@ -260,6 +269,10 @@ . = 0 break + if(target && !(target in user.do_afters)) + . = FALSE + break + if(needhand) //This might seem like an odd check, but you can still need a hand even when it's empty //i.e the hand is used to pull some item/tool out of the construction @@ -270,8 +283,10 @@ if(user.get_active_held_item() != holding) . = 0 break - if (progress) + if(progress) qdel(progbar) + if(!QDELETED(target)) + LAZYREMOVE(user.do_afters, target) /mob/proc/do_after_coefficent() // This gets added to the delay on a do_after, default 1 . = 1 @@ -291,6 +306,7 @@ var/list/originalloc = list() for(var/atom/target in targets) originalloc[target] = target.loc + LAZYADD(user.do_afters, target) var/holding = user.get_active_held_item() var/datum/progressbar/progbar @@ -321,3 +337,7 @@ break mainloop if(progbar) qdel(progbar) + for(var/thing in targets) + var/atom/target = thing + if(!QDELETED(target)) + LAZYREMOVE(user.do_afters, target) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 9e426843e4..cb99fdc5a3 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -93,7 +93,6 @@ return language_holder /datum/mind/proc/transfer_to(mob/new_character, var/force_key_move = 0) - var/original_character = null var/old_character = current var/signals = SEND_SIGNAL(new_character, COMSIG_MOB_PRE_PLAYER_CHANGE, new_character, old_character) | SEND_SIGNAL(src, COMSIG_PRE_MIND_TRANSFER, new_character, old_character) if(signals & COMPONENT_STOP_MIND_TRANSFER) diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index d70a4ebdb2..b1ba49b7ab 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -206,8 +206,6 @@ /// Additional beneficial effects when the wound is gained, in case you want to give a temporary boost to allow the victim to try an escape or last stand /datum/wound/proc/second_wind() - if(HAS_TRAIT(victim, TRAIT_NOMETABOLISM)) - return switch(severity) if(WOUND_SEVERITY_MODERATE) diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm new file mode 100644 index 0000000000..93ca9c5b67 --- /dev/null +++ b/code/datums/wounds/bones.dm @@ -0,0 +1,453 @@ + +/* + Bones +*/ +// TODO: well, a lot really, but i'd kill to get overlays and a bonebreaking effect like Blitz: The League, similar to electric shock skeletons + +/* + Base definition +*/ +/datum/wound/brute/bone + sound_effect = 'sound/effects/crack1.ogg' + wound_type = WOUND_LIST_BONE + + /// The item we're currently splinted with, if there is one + var/obj/item/stack/splinted + + /// Have we been taped? + var/taped + /// Have we been bone gel'd? + var/gelled + /// If we did the gel + surgical tape healing method for fractures, how many regen points we need + var/regen_points_needed + /// Our current counter for gel + surgical tape regeneration + var/regen_points_current + /// If we suffer severe head booboos, we can get brain traumas tied to them + var/datum/brain_trauma/active_trauma + /// What brain trauma group, if any, we can draw from for head wounds + var/brain_trauma_group + /// If we deal brain traumas, when is the next one due? + var/next_trauma_cycle + /// How long do we wait +/- 20% for the next trauma? + var/trauma_cycle_cooldown + /// If this is a chest wound and this is set, we have this chance to cough up blood when hit in the chest + var/chance_internal_bleeding = 0 + +/* + Overwriting of base procs +*/ +/datum/wound/brute/bone/wound_injury(datum/wound/old_wound = null) + if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group) + processes = TRUE + active_trauma = victim.gain_trauma_type(brain_trauma_group, TRAUMA_RESILIENCE_WOUND) + next_trauma_cycle = world.time + (rand(100-WOUND_BONE_HEAD_TIME_VARIANCE, 100+WOUND_BONE_HEAD_TIME_VARIANCE) * 0.01 * trauma_cycle_cooldown) + + RegisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, .proc/attack_with_hurt_hand) + if(limb.held_index && victim.get_item_for_held_index(limb.held_index) && (disabling || prob(30 * severity))) + var/obj/item/I = victim.get_item_for_held_index(limb.held_index) + if(istype(I, /obj/item/offhand)) + I = victim.get_inactive_held_item() + + if(I && victim.dropItemToGround(I)) + victim.visible_message("[victim] drops [I] in shock!", "The force on your [limb.name] causes you to drop [I]!", vision_distance=COMBAT_MESSAGE_RANGE) + + update_inefficiencies() + +/datum/wound/brute/bone/remove_wound(ignore_limb, replaced) + limp_slowdown = 0 + QDEL_NULL(active_trauma) + if(victim) + UnregisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK) + return ..() + +/datum/wound/brute/bone/handle_process() + . = ..() + if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group && world.time > next_trauma_cycle) + if(active_trauma) + QDEL_NULL(active_trauma) + else + active_trauma = victim.gain_trauma_type(brain_trauma_group, TRAUMA_RESILIENCE_WOUND) + next_trauma_cycle = world.time + (rand(100-WOUND_BONE_HEAD_TIME_VARIANCE, 100+WOUND_BONE_HEAD_TIME_VARIANCE) * 0.01 * trauma_cycle_cooldown) + + if(!regen_points_needed) + return + + regen_points_current++ + if(prob(severity * 2)) + victim.take_bodypart_damage(rand(2, severity * 2), stamina=rand(2, severity * 2.5), wound_bonus=CANT_WOUND) + if(prob(33)) + to_chat(victim, "You feel a sharp pain in your body as your bones are reforming!") + + if(regen_points_current > regen_points_needed) + if(!victim || !limb) + qdel(src) + return + to_chat(victim, "Your [limb.name] has recovered from your fracture!") + remove_wound() + +/// If we're a human who's punching something with a broken arm, we might hurt ourselves doing so +/datum/wound/brute/bone/proc/attack_with_hurt_hand(mob/M, atom/target, proximity) + if(victim.get_active_hand() != limb || victim.a_intent == INTENT_HELP || !ismob(target) || severity <= WOUND_SEVERITY_MODERATE) + return + + // With a severe or critical wound, you have a 15% or 30% chance to proc pain on hit + if(prob((severity - 1) * 15)) + // And you have a 70% or 50% chance to actually land the blow, respectively + if(prob(70 - 20 * (severity - 1))) + to_chat(victim, "The fracture in your [limb.name] shoots with pain as you strike [target]!") + limb.receive_damage(brute=rand(1,5)) + else + victim.visible_message("[victim] weakly strikes [target] with [victim.p_their()] broken [limb.name], recoiling from pain!", \ + "You fail to strike [target] as the fracture in your [limb.name] lights up in unbearable pain!", vision_distance=COMBAT_MESSAGE_RANGE) + victim.emote("scream") + victim.Stun(0.5 SECONDS) + limb.receive_damage(brute=rand(3,7)) + return COMPONENT_NO_ATTACK_HAND + +/datum/wound/brute/bone/receive_damage(wounding_type, wounding_dmg, wound_bonus) + if(!victim) + return + + if(limb.body_zone == BODY_ZONE_CHEST && victim.blood_volume && prob(chance_internal_bleeding + wounding_dmg)) + var/blood_bled = rand(1, wounding_dmg * (severity == WOUND_SEVERITY_CRITICAL ? 2 : 1.5)) // 12 brute toolbox can cause up to 18/24 bleeding with a severe/critical chest wound + switch(blood_bled) + if(1 to 6) + victim.bleed(blood_bled, TRUE) + if(7 to 13) + victim.visible_message("[victim] coughs up a bit of blood from the blow to [victim.p_their()] chest.", "You cough up a bit of blood from the blow to your chest.") + victim.bleed(blood_bled, TRUE) + if(14 to 19) + victim.visible_message("[victim] spits out a string of blood from the blow to [victim.p_their()] chest!", "You spit out a string of blood from the blow to your chest!") + new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) + victim.bleed(blood_bled) + if(20 to INFINITY) + victim.visible_message("[victim] chokes up a spray of blood from the blow to [victim.p_their()] chest!", "You choke up on a spray of blood from the blow to your chest!") + victim.bleed(blood_bled) + new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) + victim.add_splatter_floor(get_step(victim.loc, victim.dir)) + + if(!(wounding_type in list(WOUND_SHARP, WOUND_BURN)) || !splinted || wound_bonus == CANT_WOUND) + return + + splinted.take_damage(wounding_dmg, damage_type = (wounding_type == WOUND_SHARP ? BRUTE : BURN), sound_effect = FALSE) + if(QDELETED(splinted)) + var/destroyed_verb = (wounding_type == WOUND_SHARP ? "torn" : "burned") + victim.visible_message("The splint securing [victim]'s [limb.name] is [destroyed_verb] away!", "The splint securing your [limb.name] is [destroyed_verb] away!", vision_distance=COMBAT_MESSAGE_RANGE) + splinted = null + treat_priority = TRUE + update_inefficiencies() + + +/datum/wound/brute/bone/get_examine_description(mob/user) + if(!splinted && !gelled && !taped) + return ..() + + var/msg = "" + if(!splinted) + msg = "[victim.p_their(TRUE)] [limb.name] [examine_desc]" + else + var/splint_condition = "" + // how much life we have left in these bandages + switch(splinted.obj_integrity / splinted.max_integrity * 100) + if(0 to 25) + splint_condition = "just barely " + if(25 to 50) + splint_condition = "loosely " + if(50 to 75) + splint_condition = "mostly " + if(75 to INFINITY) + splint_condition = "tightly " + + msg = "[victim.p_their(TRUE)] [limb.name] is [splint_condition] fastened in a splint of [splinted.name]" + + if(taped) + msg += ", and appears to be reforming itself under some surgical tape!" + else if(gelled) + msg += ", with fizzing flecks of blue bone gel sparking off the bone!" + else + msg += "!" + return "[msg]" + +/* + New common procs for /datum/wound/brute/bone/ +*/ + +/datum/wound/brute/bone/proc/update_inefficiencies() + if(limb.body_zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) + if(splinted) + limp_slowdown = initial(limp_slowdown) * splinted.splint_factor + else + limp_slowdown = initial(limp_slowdown) + victim.apply_status_effect(STATUS_EFFECT_LIMP) + else if(limb.body_zone in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + if(splinted) + interaction_efficiency_penalty = 1 + ((interaction_efficiency_penalty - 1) * splinted.splint_factor) + else + interaction_efficiency_penalty = interaction_efficiency_penalty + + if(initial(disabling) && splinted) + disabling = FALSE + else if(initial(disabling)) + disabling = TRUE + + limb.update_wounds() + +/* + BEWARE OF REDUNDANCY AHEAD THAT I MUST PARE DOWN +*/ + +/datum/wound/brute/bone/proc/splint(obj/item/stack/I, mob/user) + if(splinted && splinted.splint_factor >= I.splint_factor) + to_chat(user, "The splint already on [user == victim ? "your" : "[victim]'s"] [limb.name] is better than you can do with [I].") + return + + user.visible_message("[user] begins splinting [victim]'s [limb.name] with [I].", "You begin splinting [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") + + if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, .proc/still_exists))) + return + + user.visible_message("[user] finishes splinting [victim]'s [limb.name]!", "You finish splinting [user == victim ? "your" : "[victim]'s"] [limb.name]!") + treat_priority = FALSE + splinted = new I.type(limb) + splinted.amount = 1 + I.use(1) + update_inefficiencies() + +/* + Moderate (Joint Dislocation) +*/ + +/datum/wound/brute/bone/moderate + name = "Joint Dislocation" + desc = "Patient's bone has been unset from socket, causing pain and reduced motor function." + treat_text = "Recommended application of bonesetter to affected limb, though manual relocation by applying an aggressive grab to the patient and helpfully interacting with afflicted limb may suffice." + examine_desc = "is awkwardly jammed out of place" + occur_text = "jerks violently and becomes unseated" + severity = WOUND_SEVERITY_MODERATE + viable_zones = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + interaction_efficiency_penalty = 1.5 + limp_slowdown = 3 + threshold_minimum = 35 + threshold_penalty = 15 + treatable_tool = TOOL_BONESET + status_effect_type = /datum/status_effect/wound/bone/moderate + scarring_descriptions = list("light discoloring", "a slight blue tint") + +/datum/wound/brute/bone/moderate/crush() + if(prob(33)) + victim.visible_message("[victim]'s dislocated [limb.name] pops back into place!", "Your dislocated [limb.name] pops back into place! Ow!") + remove_wound() + +/datum/wound/brute/bone/moderate/try_handling(mob/living/carbon/human/user) + if(user.pulling != victim || user.zone_selected != limb.body_zone || user.a_intent == INTENT_GRAB) + return FALSE + + if(user.grab_state == GRAB_PASSIVE) + to_chat(user, "You must have [victim] in an aggressive grab to manipulate [victim.p_their()] [lowertext(name)]!") + return TRUE + + if(user.grab_state >= GRAB_AGGRESSIVE) + user.visible_message("[user] begins twisting and straining [victim]'s dislocated [limb.name]!", "You begin twisting and straining [victim]'s dislocated [limb.name]...", ignored_mobs=victim) + to_chat(victim, "[user] begins twisting and straining your dislocated [limb.name]!") + if(user.a_intent == INTENT_HELP) + chiropractice(user) + else + malpractice(user) + return TRUE + +/// If someone is snapping our dislocated joint back into place by hand with an aggro grab and help intent +/datum/wound/brute/bone/moderate/proc/chiropractice(mob/living/carbon/human/user) + var/time = base_treat_time + + if(!do_after(user, time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) + return + + if(prob(65)) + user.visible_message("[user] snaps [victim]'s dislocated [limb.name] back into place!", "You snap [victim]'s dislocated [limb.name] back into place!", ignored_mobs=victim) + to_chat(victim, "[user] snaps your dislocated [limb.name] back into place!") + victim.emote("scream") + limb.receive_damage(brute=20, wound_bonus=CANT_WOUND) + qdel(src) + else + user.visible_message("[user] wrenches [victim]'s dislocated [limb.name] around painfully!", "You wrench [victim]'s dislocated [limb.name] around painfully!", ignored_mobs=victim) + to_chat(victim, "[user] wrenches your dislocated [limb.name] around painfully!") + limb.receive_damage(brute=10, wound_bonus=CANT_WOUND) + chiropractice(user) + +/// If someone is snapping our dislocated joint into a fracture by hand with an aggro grab and harm or disarm intent +/datum/wound/brute/bone/moderate/proc/malpractice(mob/living/carbon/human/user) + var/time = base_treat_time + + if(!do_after(user, time, target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) + return + + if(prob(65)) + user.visible_message("[user] snaps [victim]'s dislocated [limb.name] with a sickening crack!", "You snap [victim]'s dislocated [limb.name] with a sickening crack!", ignored_mobs=victim) + to_chat(victim, "[user] snaps your dislocated [limb.name] with a sickening crack!") + victim.emote("scream") + limb.receive_damage(brute=25, wound_bonus=30) + else + user.visible_message("[user] wrenches [victim]'s dislocated [limb.name] around painfully!", "You wrench [victim]'s dislocated [limb.name] around painfully!", ignored_mobs=victim) + to_chat(victim, "[user] wrenches your dislocated [limb.name] around painfully!") + limb.receive_damage(brute=10, wound_bonus=CANT_WOUND) + malpractice(user) + + +/datum/wound/brute/bone/moderate/treat(obj/item/I, mob/user) + if(victim == user) + victim.visible_message("[user] begins resetting [victim.p_their()] [limb.name] with [I].", "You begin resetting your [limb.name] with [I]...") + else + user.visible_message("[user] begins resetting [victim]'s [limb.name] with [I].", "You begin resetting [victim]'s [limb.name] with [I]...") + + if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, .proc/still_exists))) + return + + if(victim == user) + limb.receive_damage(brute=15, wound_bonus=CANT_WOUND) + victim.visible_message("[user] finishes resetting [victim.p_their()] [limb.name]!", "You reset your [limb.name]!") + else + limb.receive_damage(brute=10, wound_bonus=CANT_WOUND) + user.visible_message("[user] finishes resetting [victim]'s [limb.name]!", "You finish resetting [victim]'s [limb.name]!", victim) + to_chat(victim, "[user] resets your [limb.name]!") + + victim.emote("scream") + qdel(src) + +/* + Severe (Hairline Fracture) +*/ + +/datum/wound/brute/bone/severe + name = "Hairline Fracture" + desc = "Patient's bone has suffered a crack in the foundation, causing serious pain and reduced limb functionality." + treat_text = "Recommended light surgical application of bone gel, though splinting will prevent worsening situation." + examine_desc = "appears bruised and grotesquely swollen" + + occur_text = "sprays chips of bone and develops a nasty looking bruise" + severity = WOUND_SEVERITY_SEVERE + interaction_efficiency_penalty = 2 + limp_slowdown = 6 + threshold_minimum = 60 + threshold_penalty = 30 + treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/gauze, /obj/item/stack/medical/bone_gel) + status_effect_type = /datum/status_effect/wound/bone/severe + treat_priority = TRUE + scarring_descriptions = list("a faded, fist-sized bruise", "a vaguely triangular peel scar") + brain_trauma_group = BRAIN_TRAUMA_MILD + trauma_cycle_cooldown = 1.5 MINUTES + chance_internal_bleeding = 40 + +/datum/wound/brute/bone/critical + name = "Compound Fracture" + desc = "Patient's bones have suffered multiple gruesome fractures, causing significant pain and near uselessness of limb." + treat_text = "Immediate binding of affected limb, followed by surgical intervention ASAP." + examine_desc = "has a cracked bone sticking out of it" + occur_text = "cracks apart, exposing broken bones to open air" + severity = WOUND_SEVERITY_CRITICAL + interaction_efficiency_penalty = 4 + limp_slowdown = 9 + sound_effect = 'sound/effects/crack2.ogg' + threshold_minimum = 115 + threshold_penalty = 50 + disabling = TRUE + treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/gauze, /obj/item/stack/medical/bone_gel) + status_effect_type = /datum/status_effect/wound/bone/critical + treat_priority = TRUE + scarring_descriptions = list("a section of janky skin lines and badly healed scars", "a large patch of uneven skin tone", "a cluster of calluses") + brain_trauma_group = BRAIN_TRAUMA_SEVERE + trauma_cycle_cooldown = 2.5 MINUTES + chance_internal_bleeding = 60 + +// doesn't make much sense for "a" bone to stick out of your head +/datum/wound/brute/bone/critical/apply_wound(obj/item/bodypart/L, silent, datum/wound/old_wound, smited) + if(L.body_zone == BODY_ZONE_HEAD) + occur_text = "splits open, exposing a bare, cracked skull through the flesh and blood" + examine_desc = "has an unsettling indent, with bits of skull poking out" + . = ..() + +/// if someone is using bone gel on our wound +/datum/wound/brute/bone/proc/gel(obj/item/stack/medical/bone_gel/I, mob/user) + if(gelled) + to_chat(user, "[user == victim ? "Your" : "[victim]'s"] [limb.name] is already coated with bone gel!") + return + + user.visible_message("[user] begins hastily applying [I] to [victim]'s' [limb.name]...", "You begin hastily applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.name], disregarding the warning label...") + + if(!do_after(user, base_treat_time * 1.5 * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, .proc/still_exists))) + return + + I.use(1) + victim.emote("scream") + if(user != victim) + user.visible_message("[user] finishes applying [I] to [victim]'s [limb.name], emitting a fizzing noise!", "You finish applying [I] to [victim]'s [limb.name]!", ignored_mobs=victim) + to_chat(victim, "[user] finishes applying [I] to your [limb.name], and you can feel the bones exploding with pain as they begin melting and reforming!") + else + var/painkiller_bonus = 0 + if(victim.drunkenness) + painkiller_bonus += 5 + if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/medicine/morphine)) + painkiller_bonus += 10 + if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/determination)) + painkiller_bonus += 5 + + if(prob(25 + (20 * severity - 2) - painkiller_bonus)) // 25%/45% chance to fail self-applying with severe and critical wounds, modded by painkillers + victim.visible_message("[victim] fails to finish applying [I] to [victim.p_their()] [limb.name], passing out from the pain!", "You black out from the pain of applying [I] to your [limb.name] before you can finish!") + victim.AdjustUnconscious(5 SECONDS) + return + victim.visible_message("[victim] finishes applying [I] to [victim.p_their()] [limb.name], grimacing from the pain!", "You finish applying [I] to your [limb.name], and your bones explode in pain!") + + limb.receive_damage(30, stamina=100, wound_bonus=CANT_WOUND) + if(!gelled) + gelled = TRUE + +/// if someone is using surgical tape on our wound +/datum/wound/brute/bone/proc/tape(obj/item/stack/sticky_tape/surgical/I, mob/user) + if(!gelled) + to_chat(user, "[user == victim ? "Your" : "[victim]'s"] [limb.name] must be coated with bone gel to perform this emergency operation!") + return + if(taped) + to_chat(user, "[user == victim ? "Your" : "[victim]'s"] [limb.name] is already wrapped in [I.name] and reforming!") + return + + user.visible_message("[user] begins applying [I] to [victim]'s' [limb.name]...", "You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.name]...") + + if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, .proc/still_exists))) + return + + regen_points_current = 0 + regen_points_needed = 30 SECONDS * (user == victim ? 1.5 : 1) * (severity - 1) + I.use(1) + if(user != victim) + user.visible_message("[user] finishes applying [I] to [victim]'s [limb.name], emitting a fizzing noise!", "You finish applying [I] to [victim]'s [limb.name]!", ignored_mobs=victim) + to_chat(victim, "[user] finishes applying [I] to your [limb.name], you immediately begin to feel your bones start to reform!") + else + victim.visible_message("[victim] finishes applying [I] to [victim.p_their()] [limb.name], !", "You finish applying [I] to your [limb.name], and you immediately begin to feel your bones start to reform!") + + taped = TRUE + processes = TRUE + +/datum/wound/brute/bone/treat(obj/item/I, mob/user) + if(istype(I, /obj/item/stack/medical/bone_gel)) + gel(I, user) + else if(istype(I, /obj/item/stack/sticky_tape/surgical)) + tape(I, user) + else if(istype(I, /obj/item/stack/medical/gauze)) + splint(I, user) + +/datum/wound/brute/bone/get_scanner_description(mob/user) + . = ..() + + . += "
" + + if(!gelled) + . += "Alternative Treatment: Apply bone gel directly to injured limb, then apply surgical tape to begin bone regeneration. This is both excruciatingly painful and slow, and only recommended in dire circumstances.\n" + else if(!taped) + . += "Continue Alternative Treatment: Apply surgical tape directly to injured limb to begin bone regeneration. Note, this is both excruciatingly painful and slow.\n" + else + . += "Note: Bone regeneration in effect. Bone is [round(regen_points_current/regen_points_needed)]% regenerated.\n" + + if(limb.body_zone == BODY_ZONE_HEAD) + . += "Cranial Trauma Detected: Patient will suffer random bouts of [severity == WOUND_SEVERITY_SEVERE ? "mild" : "severe"] brain traumas until bone is repaired." + else if(limb.body_zone == BODY_ZONE_CHEST && victim.blood_volume) + . += "Ribcage Trauma Detected: Further trauma to chest is likely to worsen internal bleeding until bone is repaired." + . += "
" diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm new file mode 100644 index 0000000000..feff9bf4de --- /dev/null +++ b/code/datums/wounds/burns.dm @@ -0,0 +1,323 @@ + + + +// TODO: well, a lot really, but specifically I want to add potential fusing of clothing/equipment on the affected area, and limb infections, though those may go in body part code +/datum/wound/burn + a_or_from = "from" + wound_type = WOUND_LIST_BURN + processes = TRUE + sound_effect = 'sound/effects/sizzle1.ogg' + + treatable_by = list(/obj/item/stack/medical/gauze, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) // sterilizer and alcohol will require reagent treatments, coming soon + + // Flesh damage vars + /// How much damage to our flesh we currently have. Once both this and infestation reach 0, the wound is considered healed + var/flesh_damage = 5 + /// Our current counter for how much flesh regeneration we have stacked from regenerative mesh/synthflesh/whatever, decrements each tick and lowers flesh_damage + var/flesh_healing = 0 + + // Infestation vars (only for severe and critical) + /// How quickly infection breeds on this burn if we don't have disinfectant + var/infestation_rate = 0 + /// Our current level of infection + var/infestation = 0 + /// Our current level of sanitization/anti-infection, from disinfectants/alcohol/UV lights. While positive, totally pauses and slowly reverses infestation effects each tick + var/sanitization = 0 + + /// Once we reach infestation beyond WOUND_INFESTATION_SEPSIS, we get this many warnings before the limb is completely paralyzed (you'd have to ignore a really bad burn for a really long time for this to happen) + var/strikes_to_lose_limb = 3 + + /// The current bandage we have for this wound (maybe move bandages to the limb?) + var/obj/item/stack/current_bandage + +/datum/wound/burn/handle_process() + . = ..() + if(strikes_to_lose_limb == 0) + victim.adjustToxLoss(0.5) + if(prob(1)) + victim.visible_message("The infection on the remnants of [victim]'s [limb.name] shift and bubble nauseatingly!", "You can feel the infection on the remnants of your [limb.name] coursing through your veins!") + return + + if(victim.reagents) + if(victim.reagents.has_reagent(/datum/reagent/medicine/spaceacillin)) + sanitization += 0.9 + if(victim.reagents.has_reagent(/datum/reagent/space_cleaner/sterilizine/)) + sanitization += 0.9 + if(victim.reagents.has_reagent(/datum/reagent/medicine/mine_salve)) + sanitization += 0.3 + flesh_healing += 0.5 + + if(current_bandage) + current_bandage.absorption_capacity -= WOUND_BURN_SANITIZATION_RATE + if(current_bandage.absorption_capacity <= 0) + victim.visible_message("Pus soaks through \the [current_bandage] on [victim]'s [limb.name].", "Pus soaks through \the [current_bandage] on your [limb.name].", vision_distance=COMBAT_MESSAGE_RANGE) + QDEL_NULL(current_bandage) + treat_priority = TRUE + + if(flesh_healing > 0) + var/bandage_factor = (current_bandage ? current_bandage.splint_factor : 1) + flesh_damage = max(0, flesh_damage - 1) + flesh_healing = max(0, flesh_healing - bandage_factor) // good bandages multiply the length of flesh healing + + // here's the check to see if we're cleared up + if((flesh_damage <= 0) && (infestation <= 1)) + to_chat(victim, "The burns on your [limb.name] have cleared up!") + qdel(src) + return + + // sanitization is checked after the clearing check but before the rest, because we freeze the effects of infection while we have sanitization + if(sanitization > 0) + var/bandage_factor = (current_bandage ? current_bandage.splint_factor : 1) + infestation = max(0, infestation - WOUND_BURN_SANITIZATION_RATE) + sanitization = max(0, sanitization - (WOUND_BURN_SANITIZATION_RATE * bandage_factor)) + return + + infestation += infestation_rate + + switch(infestation) + if(0 to WOUND_INFECTION_MODERATE) + if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE) + if(prob(30)) + victim.adjustToxLoss(0.2) + if(prob(6)) + to_chat(victim, "The blisters on your [limb.name] ooze a strange pus...") + if(WOUND_INFECTION_SEVERE to WOUND_INFECTION_CRITICAL) + if(!disabling && prob(2)) + to_chat(victim, "Your [limb.name] completely locks up, as you struggle for control against the infection!") + disabling = TRUE + else if(disabling && prob(8)) + to_chat(victim, "You regain sensation in your [limb.name], but it's still in terrible shape!") + disabling = FALSE + else if(prob(20)) + victim.adjustToxLoss(0.5) + if(WOUND_INFECTION_CRITICAL to WOUND_INFECTION_SEPTIC) + if(!disabling && prob(3)) + to_chat(victim, "You suddenly lose all sensation of the festering infection in your [limb.name]!") + disabling = TRUE + else if(disabling && prob(3)) + to_chat(victim, "You can barely feel your [limb.name] again, and you have to strain to retain motor control!") + disabling = FALSE + else if(prob(1)) + to_chat(victim, "You contemplate life without your [limb.name]...") + victim.adjustToxLoss(0.75) + else if(prob(4)) + victim.adjustToxLoss(1) + if(WOUND_INFECTION_SEPTIC to INFINITY) + if(prob(infestation)) + switch(strikes_to_lose_limb) + if(3 to INFINITY) + to_chat(victim, "The skin on your [limb.name] is literally dripping off, you feel awful!") + if(2) + to_chat(victim, "The infection in your [limb.name] is literally dripping off, you feel horrible!") + if(1) + to_chat(victim, "Infection has just about completely claimed your [limb.name]!") + if(0) + to_chat(victim, "The last of the nerve endings in your [limb.name] wither away, as the infection completely paralyzes your joint connector.") + threshold_penalty = 120 // piss easy to destroy + var/datum/brain_trauma/severe/paralysis/sepsis = new (limb.body_zone) + victim.gain_trauma(sepsis) + strikes_to_lose_limb-- + +/datum/wound/burn/get_examine_description(mob/user) + if(strikes_to_lose_limb <= 0) + return "[victim.p_their(TRUE)] [limb.name] is completely dead and unrecognizable as organic." + + var/condition = "" + if(current_bandage) + var/bandage_condition + switch(current_bandage.absorption_capacity) + if(0 to 1.25) + bandage_condition = "nearly ruined " + if(1.25 to 2.75) + bandage_condition = "badly worn " + if(2.75 to 4) + bandage_condition = "slightly pus-stained " + if(4 to INFINITY) + bandage_condition = "clean " + + condition += " underneath a dressing of [bandage_condition] [current_bandage.name]" + else + switch(infestation) + if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE) + condition += ", with small spots of discoloration along the nearby veins!" + if(WOUND_INFECTION_SEVERE to WOUND_INFECTION_CRITICAL) + condition += ", with dark clouds spreading outwards under the skin!" + if(WOUND_INFECTION_CRITICAL to WOUND_INFECTION_SEPTIC) + condition += ", with streaks of rotten infection pulsating outward!" + if(WOUND_INFECTION_SEPTIC to INFINITY) + return "[victim.p_their(TRUE)] [limb.name] is a mess of char and rot, skin literally dripping off the bone with infection!" + else + condition += "!" + + return "[victim.p_their(TRUE)] [limb.name] [examine_desc][condition]" + +/datum/wound/burn/get_scanner_description(mob/user) + if(strikes_to_lose_limb == 0) + var/oopsie = "Type: [name]\nSeverity: [severity_text()]" + oopsie += "
Infection Level: The infection is total. The bodypart is lost. Amputate or augment limb immediately.
" + return oopsie + + . = ..() + . += "
" + + if(infestation <= sanitization && flesh_damage <= flesh_healing) + . += "No further treatment required: Burns will heal shortly." + else + switch(infestation) + if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE) + . += "Infection Level: Moderate\n" + if(WOUND_INFECTION_SEVERE to WOUND_INFECTION_CRITICAL) + . += "Infection Level: Severe\n" + if(WOUND_INFECTION_CRITICAL to WOUND_INFECTION_SEPTIC) + . += "Infection Level: CRITICAL\n" + if(WOUND_INFECTION_SEPTIC to INFINITY) + . += "Infection Level: LOSS IMMINENT\n" + if(infestation > sanitization) + . += "\tSurgical debridement, antiobiotics/sterilizers, or regenerative mesh will rid infection. Paramedic UV penlights are also effective.\n" + + if(flesh_damage > 0) + . += "Flesh damage detected: Please apply ointment or regenerative mesh to allow recovery.\n" + . += "
" + +/* + new burn common procs +*/ + +/// if someone is using ointment on our burns +/datum/wound/burn/proc/ointment(obj/item/stack/medical/ointment/I, mob/user) + user.visible_message("[user] begins applying [I] to [victim]'s [limb.name]...", "You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.name]...") + if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), extra_checks = CALLBACK(src, .proc/still_exists))) + return + + limb.heal_damage(I.heal_brute, I.heal_burn) + user.visible_message("[user] applies [I] to [victim].", "You apply [I] to [user == victim ? "your" : "[victim]'s"] [limb.name].") + I.use(1) + sanitization += I.sanitization + flesh_healing += I.flesh_regeneration + + if((infestation <= 0 || sanitization >= infestation) && (flesh_damage <= 0 || flesh_healing > flesh_damage)) + to_chat(user, "You've done all you can with [I], now you must wait for the flesh on [victim]'s [limb.name] to recover.") + else + try_treating(I, user) + +/// for use in the burn dressing surgery since we don't want to make them do another do_after obviously +/datum/wound/burn/proc/force_bandage(obj/item/stack/medical/gauze/I, mob/user) + QDEL_NULL(current_bandage) + current_bandage = new I.type(limb) + current_bandage.amount = 1 + treat_priority = FALSE + sanitization += I.sanitization + I.use(1) + +/// if someone is wrapping gauze on our burns +/datum/wound/burn/proc/bandage(obj/item/stack/medical/gauze/I, mob/user) + if(current_bandage) + if(current_bandage.absorption_capacity > I.absorption_capacity + 1) + to_chat(user, "The [current_bandage] on [victim]'s [limb.name] is still in better condition than your [I.name]!") + return + user.visible_message("[user] begins to redress the burns on [victim]'s [limb.name] with [I]...", "You begin redressing the burns on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") + else + user.visible_message("[user] begins to dress the burns on [victim]'s [limb.name] with [I]...", "You begin dressing the burns on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") + + if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) + return + + user.visible_message("[user] applies [I] to [victim].", "You apply [I] to [user == victim ? "your" : "[victim]'s"] [limb.name].") + QDEL_NULL(current_bandage) + current_bandage = new I.type(limb) + current_bandage.amount = 1 + treat_priority = FALSE + sanitization += I.sanitization + I.use(1) + +/// if someone is using mesh on our burns +/datum/wound/burn/proc/mesh(obj/item/stack/medical/mesh/I, mob/user) + user.visible_message("[user] begins wrapping [victim]'s [limb.name] with [I]...", "You begin wrapping [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") + if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) + return + + limb.heal_damage(I.heal_brute, I.heal_burn) + user.visible_message("[user] applies [I] to [victim].", "You apply [I] to [user == victim ? "your" : "[victim]'s"] [limb.name].") + I.use(1) + sanitization += I.sanitization + flesh_healing += I.flesh_regeneration + + if(sanitization >= infestation && flesh_healing > flesh_damage) + to_chat(user, "You've done all you can with [I], now you must wait for the flesh on [victim]'s [limb.name] to recover.") + else + try_treating(I, user) + +/// Paramedic UV penlights +/datum/wound/burn/proc/uv(obj/item/flashlight/pen/paramedic/I, mob/user) + if(I.uv_cooldown > world.time) + to_chat(user, "[I] is still recharging!") + return + if(infestation <= 0 || infestation < sanitization) + to_chat(user, "There's no infection to treat on [victim]'s [limb.name]!") + return + + user.visible_message("[user] flashes the burns on [victim]'s [limb] with [I].", "You flash the burns on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I].", vision_distance=COMBAT_MESSAGE_RANGE) + sanitization += I.uv_power + I.uv_cooldown = world.time + I.uv_cooldown_length + +/datum/wound/burn/treat(obj/item/I, mob/user) + if(istype(I, /obj/item/stack/medical/gauze)) + bandage(I, user) + else if(istype(I, /obj/item/stack/medical/ointment)) + ointment(I, user) + else if(istype(I, /obj/item/stack/medical/mesh)) + mesh(I, user) + else if(istype(I, /obj/item/flashlight/pen/paramedic)) + uv(I, user) + +/// basic support for instabitaluri/synthflesh healing flesh damage, more chem support in the future +/datum/wound/burn/proc/regenerate_flesh(amount) + flesh_healing += amount * 0.5 // 20u patch will heal 10 flesh standard + +// we don't even care about first degree burns, straight to second +/datum/wound/burn/moderate + name = "Second Degree Burns" + desc = "Patient is suffering considerable burns with mild skin penetration, weakening limb integrity and increased burning sensations." + treat_text = "Recommended application of topical ointment or regenerative mesh to affected region." + examine_desc = "is badly burned and breaking out in blisters" + occur_text = "breaks out with violent red burns" + severity = WOUND_SEVERITY_MODERATE + damage_mulitplier_penalty = 1.1 + threshold_minimum = 40 + threshold_penalty = 30 // burns cause significant decrease in limb integrity compared to other wounds + status_effect_type = /datum/status_effect/wound/burn/moderate + flesh_damage = 5 + scarring_descriptions = list("small amoeba-shaped skinmarks", "a faded streak of depressed skin") + +/datum/wound/burn/severe + name = "Third Degree Burns" + desc = "Patient is suffering extreme burns with full skin penetration, creating serious risk of infection and greatly reduced limb integrity." + treat_text = "Recommended immediate disinfection and excision of any infected skin, followed by bandaging and ointment." + examine_desc = "appears seriously charred, with aggressive red splotches" + occur_text = "chars rapidly, exposing ruined tissue and spreading angry red burns" + severity = WOUND_SEVERITY_SEVERE + damage_mulitplier_penalty = 1.2 + threshold_minimum = 80 + threshold_penalty = 40 + status_effect_type = /datum/status_effect/wound/burn/severe + treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/gauze, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) + infestation_rate = 0.05 // appx 13 minutes to reach sepsis without any treatment + flesh_damage = 12.5 + scarring_descriptions = list("a large, jagged patch of faded skin", "random spots of shiny, smooth skin", "spots of taut, leathery skin") + +/datum/wound/burn/critical + name = "Catastrophic Burns" + desc = "Patient is suffering near complete loss of tissue and significantly charred muscle and bone, creating life-threatening risk of infection and negligible limb integrity." + treat_text = "Immediate surgical debriding of any infected skin, followed by potent tissue regeneration formula and bandaging." + examine_desc = "is a ruined mess of blanched bone, melted fat, and charred tissue" + occur_text = "vaporizes as flesh, bone, and fat melt together in a horrifying mess" + severity = WOUND_SEVERITY_CRITICAL + damage_mulitplier_penalty = 1.3 + sound_effect = 'sound/effects/sizzle2.ogg' + threshold_minimum = 140 + threshold_penalty = 80 + status_effect_type = /datum/status_effect/wound/burn/critical + treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/gauze, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) + infestation_rate = 0.15 // appx 4.33 minutes to reach sepsis without any treatment + flesh_damage = 20 + scarring_descriptions = list("massive, disfiguring keloid scars", "several long streaks of badly discolored and malformed skin", "unmistakeable splotches of dead tissue from serious burns") diff --git a/code/datums/wounds/cuts.dm b/code/datums/wounds/cuts.dm index 5f9d754238..578c8b9ddf 100644 --- a/code/datums/wounds/cuts.dm +++ b/code/datums/wounds/cuts.dm @@ -129,7 +129,7 @@ if(user.pulling != victim || user.zone_selected != limb.body_zone || user.a_intent == INTENT_GRAB) return FALSE - if(!isfelinid(user)) + if(!iscatperson(user)) return FALSE lick_wounds(user) diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm index 16e8046ee2..bd25169fe4 100644 --- a/code/game/objects/items/grenades/flashbang.dm +++ b/code/game/objects/items/grenades/flashbang.dm @@ -62,11 +62,11 @@ /obj/item/grenade/stingbang/breaker name = "breakbang" - shrapnel_type = /obj/projectile/bullet/pellet/stingball/breaker + shrapnel_type = /obj/item/projectile/bullet/pellet/stingball/breaker /obj/item/grenade/stingbang/shred name = "shredbang" - shrapnel_type = /obj/projectile/bullet/pellet/stingball/shred + shrapnel_type = /obj/item/projectile/bullet/pellet/stingball/shred /obj/item/grenade/stingbang/prime(mob/living/lanced_by) if(iscarbon(loc)) diff --git a/code/game/objects/items/shrapnel.dm b/code/game/objects/items/shrapnel.dm index de8bf9459d..b74b0563b7 100644 --- a/code/game/objects/items/shrapnel.dm +++ b/code/game/objects/items/shrapnel.dm @@ -67,13 +67,13 @@ ricochets_max = 6 ricochet_chance = 110 -/obj/projectile/bullet/pellet/stingball/breaker +/obj/item/projectile/bullet/pellet/stingball/breaker name = "breakbang pellet" damage = 10 wound_bonus = 40 sharpness = FALSE -/obj/projectile/bullet/pellet/stingball/shred +/obj/item/projectile/bullet/pellet/stingball/shred name = "shredbang pellet" damage = 10 wound_bonus = 30 diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 8a0f4fe13a..1e70b4bd80 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -120,7 +120,7 @@ gender = PLURAL singular_name = "medical gauze" icon_state = "gauze" - var/heal_brute = 5 + heal_brute = 5 self_delay = 50 other_delay = 20 amount = 6 @@ -241,7 +241,7 @@ heal_burn = 5 flesh_regeneration = 2.5 sanitization = 0.3 - grind_results = list(/datum/reagent/medicine/C2/lenturi = 10) + grind_results = list(/datum/reagent/medicine/kelotane = 10) /obj/item/stack/medical/ointment/heal(mob/living/M, mob/user) if(M.stat == DEAD) @@ -336,7 +336,7 @@ amount = 4 self_delay = 20 - grind_results = list(/datum/reagent/medicine/C2/libital = 10) + grind_results = list(/datum/reagent/medicine/bicaridine = 10) novariants = TRUE /obj/item/stack/medical/bone_gel/attack(mob/living/M, mob/user) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index fb1313fc70..0d3d2beb8b 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -57,8 +57,7 @@ /obj/item/stack/medical/gauze = 1, /obj/item/stack/medical/suture/emergency = 1, /obj/item/stack/medical/ointment = 1, - /obj/item/reagent_containers/hypospray/medipen/ekit = 2, - /obj/item/storage/pill_bottle/iron = 1) + /obj/item/reagent_containers/hypospray/medipen/ekit = 2) generate_items_inside(items_inside,src) /obj/item/storage/firstaid/ancient diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index e69b2b6272..a4cc2af838 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -143,7 +143,6 @@ if(prob(50)) step(W, pick(GLOB.alldirs)) ADD_TRAIT(H, TRAIT_DISFIGURED, TRAIT_GENERIC) - H.bleed_rate = 5 H.gib_animation() sleep(3) H.adjustBruteLoss(1000) //to make the body super-bloody diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 50c58b0ade..c03fd53da3 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -541,7 +541,7 @@ change_construction_value(-2) return ..() -/obj/structure/table/reinforced/brass/tablepush(mob/living/user, mob/living/pushed_mob) +/obj/structure/table/reinforced/brass/tablelimbsmash(mob/living/user, mob/living/pushed_mob) .= ..() playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 50, TRUE) @@ -565,7 +565,7 @@ buildstack = /obj/item/stack/tile/bronze canSmoothWith = list(/obj/structure/table/reinforced/brass, /obj/structure/table/bronze) -/obj/structure/table/bronze/tablepush(mob/living/user, mob/living/pushed_mob) +/obj/structure/table/bronze/tablelimbsmash(mob/living/user, mob/living/pushed_mob) ..() playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 50, TRUE) @@ -594,7 +594,7 @@ computer.table = src break -/obj/structure/table/optable/tablepush(mob/living/user, mob/living/pushed_mob) +/obj/structure/table/optable/tablelimbsmash(mob/living/user, mob/living/pushed_mob) pushed_mob.forceMove(loc) pushed_mob.set_resting(TRUE, TRUE) visible_message("[user] has laid [pushed_mob] on [src].") diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm index a113f9c083..caca020b32 100644 --- a/code/modules/antagonists/bloodsucker/powers/feed.dm +++ b/code/modules/antagonists/bloodsucker/powers/feed.dm @@ -226,7 +226,9 @@ playsound(get_turf(target), 'sound/effects/splat.ogg', 40, 1) if(ishuman(target)) var/mob/living/carbon/human/H = target - H.bleed_rate += 5 + var/obj/item/bodypart/head_part = H.get_bodypart(BODY_ZONE_HEAD) + if(head_part) + head_part.generic_bleedstacks += 5 target.add_splatter_floor(get_turf(target)) user.add_mob_blood(target) // Put target's blood on us. The donor goes in the ( ) target.add_mob_blood(target) diff --git a/code/modules/antagonists/bloodsucker/powers/recuperate.dm b/code/modules/antagonists/bloodsucker/powers/recuperate.dm index 6b8795ea02..90a2e3ff38 100644 --- a/code/modules/antagonists/bloodsucker/powers/recuperate.dm +++ b/code/modules/antagonists/bloodsucker/powers/recuperate.dm @@ -27,8 +27,9 @@ C.blood_volume -= 0.2 C.adjustStaminaLoss(-15) // Stop Bleeding - if(istype(H) && H.bleed_rate > 0 && rand(20) == 0) - H.bleed_rate -- + if(istype(H) && H.is_bleeding() && rand(20) == 0) + for(var/obj/item/bodypart/part in H.bodyparts) + part.generic_bleedstacks -- C.Jitter(5) sleep(10) // DONE! diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index e08886e71f..e12a8fb1e5 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -227,8 +227,8 @@ /obj/item/clothing/examine(mob/user) . = ..() if(damaged_clothes == CLOTHING_SHREDDED) - . += "It is completely shredded and requires mending before it can be worn again!" - return + . += "It is completely shredded and requires mending before it can be worn again!" + return for(var/zone in damage_by_parts) var/pct_damage_part = damage_by_parts[zone] / limb_integrity * 100 var/zone_name = parse_zone(zone) diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 1c753b15df..b61743729f 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -168,7 +168,7 @@ icon_state = "bulletproof" item_state = "armor" blood_overlay_type = "armor" - armor = list("melee" = 15, "bullet" = 60, "laser" = 10, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50 "wound" = 20) + armor = list("melee" = 15, "bullet" = 60, "laser" = 10, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50, "wound" = 20) strip_delay = 70 equip_delay_other = 50 mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 323df097b2..49a3bffd42 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -569,7 +569,7 @@ client.prefs.scars_list["[cur_scar_index]"] = valid_scars client.prefs.save_character() - client.prefs.copy_to(H, antagonist = is_antag) + client.prefs.copy_to(H) H.dna.update_dna_identity() if(mind) if(transfer_after) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index ee0b58f766..478599e2c0 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -7,12 +7,7 @@ /mob/living/carbon/monkey/handle_blood() if(bodytemperature <= TCRYO || (HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood. - var/temp_bleed = 0 - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X - temp_bleed += BP.get_bleed_rate() - BP.generic_bleedstacks = max(0, BP.generic_bleedstacks - 1) - bleed(temp_bleed) + return var/temp_bleed = 0 for(var/X in bodyparts) @@ -29,7 +24,7 @@ /mob/living/carbon/human/proc/resume_bleeding() bleedsuppress = 0 - if(stat != DEAD && bleed_rate) + if(stat != DEAD && is_bleeding()) to_chat(src, "The blood soaks through your bandage.") @@ -47,16 +42,10 @@ if(NOBLOOD in dna.species.species_traits || bleedsuppress || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) return - if(bleed_rate < 0) - bleed_rate = 0 - - if(HAS_TRAIT(src, TRAIT_NOMARROW)) //Bloodsuckers don't need to be here. - return - - if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood. + if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood. //Blood regeneration if there is some space - if(blood_volume < (BLOOD_VOLUME_NORMAL * blood_ratio) && !HAS_TRAIT(src, TRAIT_NOHUNGER)) + if(blood_volume < BLOOD_VOLUME_NORMAL && !HAS_TRAIT(src, TRAIT_NOHUNGER)) var/nutrition_ratio = 0 switch(nutrition) if(0 to NUTRITION_LEVEL_STARVING) @@ -69,22 +58,27 @@ nutrition_ratio = 0.8 else nutrition_ratio = 1 - if(HAS_TRAIT(src, TRAIT_HIGH_BLOOD)) - nutrition_ratio *= 1.2 if(satiety > 80) nutrition_ratio *= 1.25 adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR) - blood_volume = min((BLOOD_VOLUME_NORMAL * blood_ratio), blood_volume + 0.5 * nutrition_ratio) + blood_volume = min(BLOOD_VOLUME_NORMAL, blood_volume + 0.5 * nutrition_ratio) //Effects of bloodloss var/word = pick("dizzy","woozy","faint") - switch(blood_volume * INVERSE(blood_ratio)) + switch(blood_volume) + if(BLOOD_VOLUME_EXCESS to BLOOD_VOLUME_MAX_LETHAL) + if(prob(15)) + to_chat(src, "Blood starts to tear your skin apart. You're going to burst!") + gib() + if(BLOOD_VOLUME_MAXIMUM to BLOOD_VOLUME_EXCESS) + if(prob(10)) + to_chat(src, "You feel terribly bloated.") if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) if(prob(5)) to_chat(src, "You feel [word].") - adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.01, 1)) + adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1)) if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY) - adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.02, 1)) + adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1)) if(prob(5)) blur_eyes(6) to_chat(src, "You feel very [word].") diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 62c78fe007..d3cfa71d9a 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -174,7 +174,6 @@ if(IS_STAMCRIT(src)) to_chat(src, "You're too exhausted.") return - var/random_turn = a_intent == INTENT_HARM //END OF CIT CHANGES var/obj/item/I = get_active_held_item() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index ea42c4df2f..4aac8af0ac 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -133,8 +133,8 @@ return TRUE for(var/datum/wound/W in all_wounds) - if(W.try_handling(user)) - return 1 + if(W.try_handling(user)) + return 1 /mob/living/carbon/attack_paw(mob/living/carbon/monkey/M) diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 61b14b2cce..ddf1019f2a 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -207,7 +207,7 @@ if(!parts.len) return var/obj/item/bodypart/picked = pick(parts) - if(picked.receive_damage(brute, burn, stamina,check_armor ? run_armor_check(picked, (brute ? "melee" : burn ? "fire" : stamina ? "bullet" : null)) : FALSE, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness)) + if(picked.receive_damage(brute, burn, stamina,check_armor ? run_armor_check(picked, (brute ? "melee" : burn ? "fire" : stamina ? "bullet" : null)) : FALSE, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness)) update_damage_overlays() //Heal MANY bodyparts, in random order @@ -235,12 +235,12 @@ update_damage_overlays() update_stamina() //CIT CHANGE - makes sure update_stamina() always gets called after a health update -// damage MANY bodyparts, in random order -/mob/living/carbon/take_overall_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE) +/// damage MANY bodyparts, in random order +/mob/living/carbon/take_overall_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status) if(status_flags & GODMODE) return //godmode - var/list/obj/item/bodypart/parts = get_damageable_bodyparts() + var/list/obj/item/bodypart/parts = get_damageable_bodyparts(required_status) var/update = 0 while(parts.len && (brute > 0 || burn > 0 || stamina > 0)) var/obj/item/bodypart/picked = pick(parts) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index c592301b96..714932af80 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -640,7 +640,7 @@ msg = "\t Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!" if(WOUND_SEVERITY_CRITICAL) msg = "\t Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!!" - to_chat(src, msg) + to_chat(src, msg) for(var/obj/item/I in LB.embedded_objects) if(I.isEmbedHarmless()) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index dbf7b7f350..0eff65fda3 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -123,6 +123,9 @@ var/list/progressbars = null //for stacking do_after bars + ///For storing what do_after's someone has, in case we want to restrict them to only one of a certain do_after at a time + var/list/do_afters + var/list/mousemove_intercept_objects var/datum/click_intercept diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index db2914e620..b6fdef69e2 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -12,13 +12,13 @@ obj/item/ammo_casing/shotgun/executioner name = "executioner slug" desc = "A 12 gauge lead slug purpose built to annihilate flesh on impact." icon_state = "stunshell" - projectile_type = /obj/projectile/bullet/shotgun_slug/executioner + projectile_type = /obj/item/projectile/bullet/shotgun_slug/executioner /obj/item/ammo_casing/shotgun/pulverizer name = "pulverizer slug" desc = "A 12 gauge lead slug purpose built to annihilate bones on impact." icon_state = "stunshell" - projectile_type = /obj/projectile/bullet/shotgun_slug/pulverizer + projectile_type = /obj/item/projectile/bullet/shotgun_slug/pulverizer /obj/item/ammo_casing/shotgun/beanbag name = "beanbag slug" diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm index 5c19edc012..05c47fc3bb 100644 --- a/code/modules/projectiles/ammunition/energy/laser.dm +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -38,7 +38,7 @@ fire_sound = 'sound/weapons/lasercannonfire.ogg' /obj/item/ammo_casing/energy/laser/hellfire - projectile_type = /obj/projectile/beam/laser/hellfire + projectile_type = /obj/item/projectile/beam/laser/hellfire e_cost = 130 select_name = "maim" diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 69e3991e39..221bd8a112 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -156,7 +156,7 @@ wound_bonus = CANT_WOUND /// For telling whether we want to roll for bone breaking or lacerations if we're bothering with wounds - var/sharpness = FALSE + sharpness = FALSE /obj/item/projectile/Initialize() . = ..() diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 7147754211..4ba72a1935 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -25,13 +25,12 @@ bare_wound_bonus = 40 //overclocked laser, does a bit more damage but has much higher wound power (-0 vs -20) -/obj/projectile/beam/laser/hellfire +/obj/item/projectile/beam/laser/hellfire name = "hellfire laser" wound_bonus = 0 damage = 25 - speed = 0.6 // higher power = faster, that's how light works right -/obj/projectile/beam/laser/hellfire/Initialize() +/obj/item/projectile/beam/laser/hellfire/Initialize() . = ..() transform *= 2 diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index b268877451..6e4a72aff0 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -2,12 +2,12 @@ name = "12g shotgun slug" damage = 60 -/obj/projectile/bullet/shotgun_slug/executioner +/obj/item/projectile/bullet/shotgun_slug/executioner name = "executioner slug" // admin only, can dismember limbs sharpness = TRUE wound_bonus = 0 -/obj/projectile/bullet/shotgun_slug/pulverizer +/obj/item/projectile/bullet/shotgun_slug/pulverizer name = "pulverizer slug" // admin only, can crush bones sharpness = FALSE wound_bonus = 0 diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index bd4abaa765..1a7289b8cc 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -66,8 +66,6 @@ max_stamina_damage = 50 body_zone = BODY_ZONE_L_ARM body_part = ARM_LEFT - aux_zone = BODY_ZONE_PRECISE_L_HAND - aux_layer = HANDS_PART_LAYER body_damage_coeff = 0.75 held_index = 1 px_x = -6 @@ -131,8 +129,6 @@ max_damage = 50 body_zone = BODY_ZONE_R_ARM body_part = ARM_RIGHT - aux_zone = BODY_ZONE_PRECISE_R_HAND - aux_layer = HANDS_PART_LAYER body_damage_coeff = 0.75 held_index = 2 px_x = 6 diff --git a/code/modules/surgery/bone_mending.dm b/code/modules/surgery/bone_mending.dm index 6afe494105..81d9fa8d97 100644 --- a/code/modules/surgery/bone_mending.dm +++ b/code/modules/surgery/bone_mending.dm @@ -39,7 +39,6 @@ name = "repair hairline fracture (bonesetter/bone gel/tape)" implements = list(/obj/item/bonesetter = 100, /obj/item/stack/medical/bone_gel = 100, /obj/item/stack/sticky_tape/surgical = 100, /obj/item/stack/sticky_tape/super = 50, /obj/item/stack/sticky_tape = 30) time = 40 - experience_given = MEDICAL_SKILL_MEDIUM /datum/surgery_step/repair_bone_hairline/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(surgery.operated_wound) @@ -76,7 +75,6 @@ name = "reset bone" implements = list(/obj/item/bonesetter = 100, /obj/item/stack/sticky_tape/surgical = 60, /obj/item/stack/sticky_tape/super = 40, /obj/item/stack/sticky_tape = 20) time = 40 - experience_given = MEDICAL_SKILL_MEDIUM /datum/surgery_step/reset_compound_fracture/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(surgery.operated_wound) @@ -111,7 +109,6 @@ name = "repair compound fracture (bone gel/tape)" implements = list(/obj/item/stack/medical/bone_gel = 100, /obj/item/stack/sticky_tape/surgical = 100, /obj/item/stack/sticky_tape/super = 50, /obj/item/stack/sticky_tape = 30) time = 40 - experience_given = MEDICAL_SKILL_MEDIUM /datum/surgery_step/repair_bone_compound/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(surgery.operated_wound) diff --git a/code/modules/surgery/burn_dressing.dm b/code/modules/surgery/burn_dressing.dm index 1d64d29ff6..1688f7b5d1 100644 --- a/code/modules/surgery/burn_dressing.dm +++ b/code/modules/surgery/burn_dressing.dm @@ -24,7 +24,6 @@ implements = list(TOOL_HEMOSTAT = 100, TOOL_SCALPEL = 85, TOOL_SAW = 60, TOOL_WIRECUTTER = 40) time = 30 repeatable = TRUE - experience_given = MEDICAL_SKILL_MEDIUM /datum/surgery_step/debride/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(surgery.operated_wound) @@ -76,7 +75,6 @@ name = "bandage burns" implements = list(/obj/item/stack/medical/gauze = 100, /obj/item/stack/sticky_tape/surgical = 100) time = 40 - experience_given = MEDICAL_SKILL_MEDIUM /datum/surgery_step/dress/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) var/datum/wound/burn/burn_wound = surgery.operated_wound diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 2a8e8763a2..64bc225d1f 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -547,7 +547,7 @@ GLOBAL_LIST_EMPTY(vending_products) qdel(O) new /obj/effect/gibspawner/human/bodypartless(get_turf(C)) - if(prob(30)) + if(prob(30)) C.apply_damage(max(0, squish_damage - crit_rebate), forced=TRUE, spread_damage=TRUE) // the 30% chance to spread the damage means you escape breaking any bones else C.take_bodypart_damage((squish_damage - crit_rebate)*0.5, wound_bonus = 5) // otherwise, deal it to 2 random limbs (or the same one) which will likely shatter something diff --git a/tgstation.dme b/tgstation.dme index dd57ad97a2..cc592a50cc 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -655,6 +655,8 @@ #include "code\datums\wires\vending.dm" #include "code\datums\wounds\_scars.dm" #include "code\datums\wounds\_wounds.dm" +#include "code\datums\wounds\bones.dm" +#include "code\datums\wounds\burns.dm" #include "code\datums\wounds\cuts.dm" #include "code\game\alternate_appearance.dm" #include "code\game\atoms.dm" From 6943462acc089433f6e1ea8d948703d8f6ae11da Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 18 Jul 2020 02:41:30 +0100 Subject: [PATCH 038/122] changes --- sound/effects/blood1.ogg | Bin 0 -> 12388 bytes sound/effects/blood2.ogg | Bin 0 -> 20136 bytes sound/effects/blood3.ogg | Bin 0 -> 13657 bytes sound/effects/butcher.ogg | Bin 0 -> 9666 bytes sound/effects/crack1.ogg | Bin 0 -> 7950 bytes sound/effects/crack2.ogg | Bin 0 -> 15346 bytes sound/effects/dismember.ogg | Bin 0 -> 15382 bytes sound/effects/sizzle1.ogg | Bin 0 -> 52702 bytes sound/effects/sizzle2.ogg | Bin 0 -> 28436 bytes sound/weapons/guillotine.ogg | Bin 0 -> 27777 bytes 10 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 sound/effects/blood1.ogg create mode 100644 sound/effects/blood2.ogg create mode 100644 sound/effects/blood3.ogg create mode 100644 sound/effects/butcher.ogg create mode 100644 sound/effects/crack1.ogg create mode 100644 sound/effects/crack2.ogg create mode 100644 sound/effects/dismember.ogg create mode 100644 sound/effects/sizzle1.ogg create mode 100644 sound/effects/sizzle2.ogg create mode 100644 sound/weapons/guillotine.ogg diff --git a/sound/effects/blood1.ogg b/sound/effects/blood1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..88c76eb9e34f480a78fb64ff36b1533590a670b0 GIT binary patch literal 12388 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
)`AkCT(zg( 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 literal 0 HcmV?d00001 diff --git a/sound/effects/blood3.ogg b/sound/effects/blood3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f6024a5ff6acdd3cd140d970828638e37726aa88 GIT binary patch literal 13657 zcmaia1z1&2xA#7DONSuRaF7EWN)Ms5G;-*a?ru;7B$RH1Lw9$BN(o4ZbO_R=sFaf5 zM*r`9-|v3kbMJoU46|p=tTnUNZ>_y%RMpB#9Y6#Ad0K@3HrktK&>-{>PbXJX8@HP- zNI=^^L%bk=8qE;Zo0yi=SPExgN7KPHI}tDjI% zf=_9gRldVAeC{@a*h>GW!u_)k25>EsSTyFuk~lZ)UqcI1TtQZUx5WSifZGHf$C1m| zkPp_-4Ue;^{^U|46CCH4QP)t`1RoDWZBL6CPmdW-Ki!lN{boPi<`Dha5W~|D6Y9`^ z$}hj=)0^^V>kJSen;DV32F+!2u}6{-fcK z0BBQjBv+5Cz+*RoJ~vUYJa(7vPgEK{Qo8joBixuB0L0;RJuY%~a18oT%NbSi^9YeW|$P=In{)X&WKIX1t2>6;EN&qOTVaW5>hc&1bX)vqJ(VtM`%8MRJ5!@NzfA{4SRw6 z%Rf730DxfPKPdiJ^#{s-QJfzi&N;wQH^eu{byJmhj|lHocN0qyz(Evq34$n&YS_$l zt3=4z6*Nri-782$DnJYVdK73>2J=`6ESf(~5}M*V04)N&;y(@don@5d&iH?n(I0eb zq^w{W=Yy&9i)m_TYI{29zVTRS3Nf7ZSf24)o{4%&75d+S^X zO^Yc{i@8P%{U$%%#(x~IUw+_(r6B6>|O9^>Dhlg$ym`XHKFKAuH4p3NuO zDhySUnz>Vwi}&9=$2zyV7yRv`<^c)#i zmjCda4mh0@=uNd;%7=gVC^il%)Ln+^KMeo?9kB$8f8vN55;lbtoI=7hHN^gBj{&Ju z0?MBRK*c5j01W^zgGLS}4tI@}bQIIUfp4;4<{+?gK2Qf25%Uuu2$|etCD_H9;}P8i zhbu@93TdUFDAxPY41`^U2J#yZaKNyK0jL2$0Q@8T1GVdje1Ep|2pl&f@gsu0AYnot z3QMNuhq4xunysbhP007>CsHehXXKNbg;ju)0BrDwpEDLq0TCw$08;`a9yBBoIRf2` zMGn9>=#UDCqIC5U1kRn{0XSAh5HYlXPJIO0M;AOKv5_7$Ccyy!3>^^gC&?jTE&~v= z11rufqX`0vVc`S3-plob&i%U@)rKKgMjSi)i75cf`rMaa8wN|B-$2C%`@9f3SXj2(TGHC;xYz13)aXE$SGxP2bFiy=p!Q&|m8af=QBBihDba9E8{CJ( zQ?E?@(~w#Rk@kx70g%DOFT|)5T?;s^&XE@E>pi^p$mBtEffWi|X=z1TY1v+_kLd}d3f9oX2_$w-!4n0$oWyCQT}|Pn=~sq)N(CEO;)I@U zN$;dyB#9X@-&Vf)h&*mV{S5(RwUwPuB&kr4Pp+r{(;5PSoHrpMSCUVvE??3BvMR`@ zR8)XBlIuIdr|G~M`K0>t&|Y$N2UstPxt9TC)qf-WkBp6!M37Z#P`rXdMN&L+C_UkZ zRZz5oJhU-hK?z)yfHFyx~;s04xMT3@|ZAC9A zoV9>jQK6=R(#{dSd0WAz;zoE$52b!IC|uo6uyES;hM?~tHjQ#qsF`XH(Xcu1W-oX$ zsaJj@LlOK!xW%*_Yk^TG038qyz_rM}2_ZLbEAbjRB5yc> zG)A3IZbr;hKn>cZfZPn!EwvkwBqxp8hy({T_=y51G=x||p0xnXc=71Ke9nF>QHKs( z(BC*>Okhd?4`p!I;Nv6-R#IRu2?RA-;Q>OSpl3+WwxWJk9H$~=nop4xgo0(ohZH?9 zrQHV?wEriLumZ8zfH-v?C>LQxY&wM4rV{`oBV8~NXK#8Ckt7ZUxD4=HHG}{wVo8ty z=6g9oU{#PfaYH~V>@a|R&;s`xLLw3m063k&jHp`8-0fvtHW)L}0H2$fser)FNtA{5 zG9<<$L2=-gN?Zv*-SueQ5EAwF89->*3wjcRuAh155x2l$b_ z$v+}N0{Ges5)fN-H&wb@^uH66f46Y|Kbt54^DGiA@N3;mO^fq4E0-nx^J-@QPm-SU z_w_$=_J3#Z|5Hoft^$PIe^!8aJ03Q0jZLfd_yP1bKG)42iHX2OuR8@?G1i^nQ0R7k zFle3}DFp-vD~J*(6oe1x(TRErscuLlCu>3SP3V}^Q-FcIu~`eIk+z@|VVr{c$s19# z5^~UjX}t&-=yD3+t7)WQC=wjfGizE7&!0eo{z+|C4myyY9k_Hm7_?#9G_nEIKNumV zO(O)S_3(ieM`s{FuG%FuDZj33eC3a=8Np;*@{hJ}4hBfj7TGswVU$(?QFVh6#$eD4 zfBS-C|ErH!c001ttwtLX&j|@HO!O4ojv983X+$6|w#N!$ZIhr2osYG}IxjNErJKZ!=O*O+z z0p4AnsHMOW_j1Cuyuot_JQFhD0KCME{DI;Sa_WzupkNFrkX_v|1~YuZFa$GTFuv}AkjDlD zkvV#=5~?lmzm$Tt-Z&flX7#-H{-C+0_g$u}qF8!=exC42}TI4_)& zkB66)or8y)2gbz<<>G<&Hjd5>jgL)oaKN~@c_zo%Sh?YFE*OlDi=CC7jg^O+o1J_A zfnQWkKP&sntGZ(uX+0oT$m{)75vlr}Tf7&mIT!#}BaaI8tztjViVWEuOn?A3NNf@0 zD)H=elP(r!5O9~ysE=~b#6w3TO9#_q=R$d=dtrO)e9|QCm&@oq7&@r{R8cInXc+b= zvBl=p3o^Ijy`*!S&m`D=8l1oke`HHT`kquZEM=jHUes0oRL*D_WGam-j9;Z8G$--eB{9MjH+D(de8bRQ z;oC3vrB=1-%I+lRDlVVQ5-I_cG?yr=ul-DXSjd+rJuDf0C(%2Vbx6+_i+=G_K@>T# zY%({|vFGNaGB#=L!%eu8m|k`#a=U@4)s}AAQY~H&D&S6yDm#~YB)DC7mi+c&xkRBl3xc z_vP23KvZqKK@F^h$%lo;ZqT>P=gv~85gRZB_XrR-3um6N%>a6GIfdprYccNgb8>ZRC;7mF7``Zpg*eE2EJf z|IZKu$xC06R*8Eb=Cc6O(R)**yuSJ&eU~WPff9S@kGV{*fPpl3wme^LcT0>Ti9y^< zUGh8h9FS)jov6L+kqwhqR+L&iHlhT_4<>3N%lHH)L+p=g(Kd{hErg> z8t{`x(sM5_H`4ol@8he&(VjZ}9A1b2l6XZonX*;9qy+f#cN{cEifP1yzh{{F;WAxW1(a7gH-P&~E?+gAbzcg8e>15wseK@&Q%1swi;6yPTeAs~P@a;rX5680ubI_3ZyVHUyqI%=7hZu zb6l-LA8XKLvEROHdRX}Qja1Hi7*EviL%VoQe~M?j0GvXv^P|!4<)1EHPFRNAk*f?J zDi}gZE`9N(AXnH+7{*e)__(@-$3tYcH+Q((V?41W{`<aCbDW`T#)OU0%Vrr5X|(Vg_==)77{ zYIYS#ru(~(n|~RLr3-EJ@;ztuxe^!>)pMn?rRH16pRuHm|1e{6kBF9e;bGnMDz|gH zQ!*W8Fo^??Q9!4@;--I+9Tcs?4Q8TH{^&%H28#w_ZTEOnv#(uhM$WOnJI`7dwp61= zX{;NJc6~`Zzm@)L`SwiYna`8q*c7^~;3f-_r0F5A?eQxoi{)3>wQsA!9x3QwwWwb( zU80?nnamdXmz~Ip|9XGWmhI0!{`oHO^ha-~hlnxdZCW7n<01h4Wi1Tk_Ow`}bZ=o4 z!lTp%DM z*>hsrlluH>stf0`wIRs0M8RjmI)bC`g-s%J(lp%d@waHXGcV`vOu6BnGk@+;q7n5C zU`=(Ea(g$wnY$LDy$d;G;anZv81%olk@q(KEB_~Ihr>-5(aqJ?%&8V5(JeRJEV8R< zBJ_ZwSsZ6Kx1cEJ&Zpzw_&ju6w$0tx?QZ44nJO&ad?Q~43f)L%6VIsi7Cz(LiKkm% z%N;j+x-mrmP@p4!qS!;G0<*{4<=t1)k@wsm@YQ*+^V3>33e+--PWyX?zdyeKrH@d>FbHzKPXoEfb4B$4ITW z+&mLdk92~Uw-k(^t&Iqne4-3rNVtc+-?2E{CU}(m9lP-hG2v+!X0OJBL`t6aC-5K#opZ|p&{MpDfMLQ_ zSy7|USISO5AahW)=@+xVYb~}N#{#caMABv|oNl$ZA8+`VU@yd{T$((vkTr~XU-E)$ zh9UZ?1EV5k-kUaxg7-W%Vm)O^EgE@h1PxaJZkEXA87T_!X^Bpn`o-GC^QcKB#I1tU zS7~wUowdjSyH~AA$@iqt>kbGLH=a}Molg;32QkxC?3SYJU5%Pfd{EVIeni@9?O0#I zdTeSxm2Ld~F{USLIM4DkNfqBj=A zEhtV0E7{lPq8XL%jzpFxbwQirUVK^6cC%uePMi{1$}6$D-r>#k=1dYA_(f*0eqpvK zkTLlx!+)Q;%^bni*v{nm0@r+FERCJHvqJJ#PrsukSb8^ZKCp z01*xbkPoBA+`|(Mkmz&Iyjn8(GT(8Jn}_%%6h>wsWwnC+ci;~`daL({GC z5d2`7u+~kg5EAy`e(RaxIk`OUR*T!1dU#6pMLX}Dn5obQ$HGVNRK!ud;+B`7{pRGY zLNlc);^9X<8!KV|@LNApm}u%$JmF4T#obw3Pia^@Q@}$s;18c zG2#ByqaOS1@1*B)7Xk69qO(D4KtQVsjiH-qW2m7m62dF_weux{9bF;ec+hyV_t}MY zYP7+$RjH{F!B6mCc`gjA;3onc;$y1#iE92tcDTOkm(be$BDb$d#5_^K``ty|Nt`r1mJo zQ2<(J7Gu|N+6)Udebtj24|aZxu2Bm!Ix4VyY;s6KhR;3NakO<4vzi)|{h~Pgo+oqN zz)?GarldDyUtnWgfC)(XoUBU9$?J=R^&lwCMX~aS6e?$ zf7U{^*5uOB94;bBK}__SRQvpODqX()dH#mL%-GV=GKGO6v4iVI)6sr4d_b&IjX(du z$N8tTLTliy={JiUT^P&^cRoOzie3;r_Ofdb6M(=y3hv?3R8Z?iR=Q#0TdiK(jQ#S< ztRFpf%nI$(4*R_zKc`w}B_e!b`#gI6%jv1#u316b+M~w|@9I146)gQepyxxbkko3G zZgT^gX^m&jZaIxB-%RfIH{g?|4`yGhP+eE73vb=;>!X{x*5Aps{E@W&F4>9GZA)~1 zj3?XiD|yU=-@Qx`EJa*#^@c7r`f1BWT~<%nIuq|TW~Qm)I6jM+G#hY>kUsqWsp?DF z{8e4Napi9gCsWYZT?9z^!|0?q2BG| zClaXj3|WOsF}U{+XBh0dmd=4%(cI-Y>^r8y|wB??*JV9VFKs^Js+KlZ-5hr_4BW1u;ih z=kGekbzZD=kk8V-+6sE&CCbDps>&7T5oEF2eAB^ZJ1X#WU;WRt5YN zrl>V*zc%1P&|&_<#l;w%$5e^ zLgEs2`PsLTd)=0i;Eb0%lj?Jk;eo2_r96fDq+Rp@^GJ%+ES*BM66>apXff=GE4nBr zJ_j=niAKRKri|_k<+k)Rxev+6wA*?8D~`3I=Vf8MVfA@GIP3T#f8id%y>JIqB&2j2 z`E}8tv$hCBecgkx)U$zMqZA`;joj;DcVY@A0E62LPZmv%w_TT5!e^m{-Uq2x+A3!? z;|ZOwjTNj};?vri1jr@5TudM6aq5^h(2&ZyuIQvaeY5Kq_9MvP7!pRsslSxlKS0%l zf$>mLG}M7vUZ)-bGj<;PHSt!3q|2P+{?fZHo$OST#*#RL#Jhkr_azPol4rumRycB{ z{prwWQC8Af`oIaMlLN@z40}U07ncd(f^~2_ler=ME$MW5Ho;8eR+?1ha{Je;w|g`m z*bdJ>-tU*|ob8J+o&Pzgxt9tMNLJ}Qk^ezpy2uge9uJF7sqlE|e|eHOofP93{S0X? zC+qf5KlugwD@*FrAq-I=Xw2g|5o_Mu+z(c)klbe4%PC_PgQ?aibh&F<#Z3|@PKDN%Xraz(X^@ zm93+s$j!sc#m&nP-X?H!aIo_5@bd6*vhu=txo57aIG~(R4qjeC4k(lZ#={NgzQ+sW zhx4*?@Nx6>gE>MhvXFTtp!tihx6n@h+P96zg+6zOc^VEsOdeXTZm*AL8GP80 zTNlQV9o&)$1KNE16UAbY=+JBh@^)nAEb=2peWPf&Rqt0kmETiA$ES8BZo@IglL z?MWJ^THy9I8eUZj2RZz@kJ1=J^tT z&Ha4dXFWioS;hHcs779?zt{r=?22d!Y18tHvQOOc`I|3q9f;^S^y-8$S@tPfcmRr#4ElTOU}jQ3(O2=C)HTb<$XScGu1p!+JqM!1EyiKprG=-;pUgmbGHV?l zgH`CZgs-O8z-+r~)B5B*<1(lxhBlO2Ur+R8hmqhm{*fm&i}yfLDg(2QC1da2T0m6Z z1>c9<>Fe?^AwzxW86JJBh{$28v?YxhL_^qSfWH>Q7tlPI_jx+n6vsIGW$c zA=3Wkec5f))%3E?()UR)^mqYnEEuH7L-qi7E|ZA)((T*F!Z>gJo(n^jMIY))Jo~s9 z94&Tf(`wl&R1a{mDPpv(RlfSp&s)v}#H+Y^{qBAc(c#6*>nn3FGnN`v9;dGNlfktq zT|-E*8oMe(in(!){q{iA^WUMhBR{NbNY*bl$l9t6rq&s6FG8NHcy!d&ELg1N)lXya zWZcbE`56`CXP%MJ)cw85;GMSob}XVjGWWI2RI@*T?RRtbSboTVswNMsK= zk++nA)!y0l+WpV^j}G#XO4` z_EKmgnm);M8)&9UwsxyKTwilxzQ?DP)NHf|1SA!+?@T37zW(8l=DhXuzNx6KlKuB# z6)vNe-Q^Ykk{qGLl`76&W2zETf5YvKMSf z>uSY)4~o$Irqvuvwphg)q9IgH3l9^=EIPB{n_Wycfa*b@Fz)s^*y!hjKKm zWih8dl=qw-34C=)-2P@^o~o0*19LtrU(N3BD$1DJFVnVRW@>*TWoX^`jD@;4;QEEb z_}HxMYisN0Z&?TM7mG^ZC#uSaUoH(p^Hx-{hjU2o$==yz79ud3#maT z#CL%7+aWkrpK|W96x8O7x+PGvv37h}C+TDs5qq<8M#VED|NWHoGj2K-C2>)WjvUa@ zUzr*a6GU5yZ)CsEM#KPccew?wpl4s=uDqxram-77eC3K==Ot?#?aMinvEH!bsk#A^ zUHq*eEi(SvQGA(;D{`gmnsEKTUr~JW4tuRXff-y(@oOD*yuAXHi~#RA5hAaTwu8Vj zDDD$*8J;ZsaNNV^@l2h$2l7MtL$d;jt><1V3)T_j7_$k3k5bM8<-+DH-D*STX3bjB zUHjtQ-a-{Db5p2`x^9^MgV7%Ffe`;P(?JzOh90U;5`eFQ@+V}H7Nixl-_Ov23qQ9rYPp(-<7IL)nmT9x9o<&)z-~Fpf%?iY5T~rJCI5Y*k={2Qi~jl zWmL#Y#~nauIDcWQ#5?dV<9)%C|C&LQ(>pKHQToj0^~2Sp*RDyE?E55sMk058q!}4B zBJ~8tThAU{`^T->zUgFtcK^))fz9Xd9Tge|+Y?u2&PuGbT9&D|ay~)!@AxsL-F*?D znbCy5jbWJ^12fBbmqz1W5fCbc`Bj{1a-OJ-(n*1L{r3O~dQjUwJIn8q+qec}=J%_t zWvWkDe(V$u9lcy2nt6-*O6gy zb6KA;2L!wybKYuuBX75yl77+Dx6|2N(KhTfOJgPMn_xX`V; z5I+xRtCI$w1?i86&X_+gpD8b&_1843Yt#?=ifkr0KAA)LHP6sq$cxoqqH!22Q#~+$ zt?S2&b5Hr_CBN_Ks(M+DGD%>?Hl0Br%EeL)yjyU{%M;P|70JL^ z%jo+trJ(EqU3G$@f4DRFOkhcg$NbZtJmSI+Uevo7cx<6P!6lr>e~M#m z64|g;t$kKSn>6`gUi9z)l;8x#1^$Ir~Y16ii7OTb?iH&_M~-H7Zqgnjl1Ti4|*`f zD~Dc=Eu7`?FU!}w9F0ToP)50*I;%;~4=ynaCqkDeIJ~m#!2InHk2wVl6N72@!XIa^livHNpYf34(zVN*BF)RRhLi4=rvOLGb0)v z&(HiaR6om-)vQcU6=X&E$3CR^EmVUu1jm1e#g&$`QbnkN5uxqNgLA*mKHTDtibqfsA2s!d!O#x^UKaHsbOUY$5)v`r~2)?(@)e4uNrF( z)9C{`uEW}*TkwHInZaj-9NXE~g6KP3PgkGwxy*H}ABY9TNjTjfJ#M0#_5S(vmYvvl z-;M~vArcRbY9U=%(rq(+bTT>fp6`iH0;vyIb8acV&x@rWo&d*E%1SlX{Zs@i6xZ~BWLbw5l2Cli%Mg&-@mig+K8sIMLaQmiipagm#qOpGDKV^E}p!k z3z=uuF7lICZLA4z6kkroeI0PY{J}u8NR6?G84=jKEG0@kVSJZV*7<7g>*S7J#}YQ& z>G`KaQrIt2vBv@vxlEYlj9#=No-YVyq3wdiEOAQ}e^>RY}N; zOZx@Ib3L@6X1fu8to%D(;!^Vj2%VOh74NJ03sb9auAwrT_^FDmBd_i->h*Inj5R91 z+;Qct*M>Z2^&)@vk*WVM_Ld*!4&A0DO{b-j0b5$V7SGZ6!%@|upv>l6Yc^bs!F}I& z&sL&*3Pt=>HB)Uy|1C#!i|QaAhsPG0-!8SDe$=+I+T*$tI!NIa0Jj{P)vA{LXA<;;qYi z+(l#5n~bwvgV$v!yU&s`6JL$C@;u93hnxJF5nTtgeQ8qexasi0i`y?>0~1$D(Ewq> zC*lRw9s#}tKEBPm!Lu#Z&!v4u;zm!usebn@`>BL%Ii>{42^C4uN8)R6@8XVimVUiU zsZ#6lZhGsDSMQT;LOl2Dl=-@!bn;rMWoGOK6VIhOL_~r4Bsvy3yewesneX#qkLB9F zjA=+OXM1kdy0rCV2_-tM5NOjLNQS&d*bd7Yt>YDE@0^}t+!6&le_e)o+}o+&5`;8q%mm- zj`NF<`_?b|yq&iKK|?s;k#b%S~{1bC|@@j{tvMMwKJ7VjNS)%S2XX%Ipkw
kle`i>!!pc4pH74I5f7sW(Zqi=3zQ{f;7`U$hd!g?%_UZVS z*%YicRxUKsxA{E1>GS3+o+$~I=gi`ekfi7Y6ROa}?KedQAyEQJHfysQ{iwv)gq*i{ z(`$vHLx!gtQ?Pe4777M#UH(ay3lOS_Ftck z2$nKeR=m~{R_HoPS26$tNCczYw`uV+XrR0O$)>p|h0Le(ysv$(vo92`ABUdI<%liF zKSPcv)f7LUWZ?q-+&^I0r2hN<;pV?Yq?=yOlXLU(@$oLPvw;^3yu+1lkeer%B0}0& zll}oz$P2KU{W%@)*{%1J_*RtuvaM*=)%`(-$H~uJr8N8}55`3}1>7O;gvYoDQrZm} z41dff8O%`ftGADN>}Fgyo&Ba<#H4h-a=h^3E5sZUAvUjK!ebi3ZXuIJ^cCQ`hOCRqm|%05JkpQ+W?9oHtA1Oq zj|Hlp$u~ctHp0Yn@Zs%~r7FT#%a8dU$ZTxjin6+_`>d@Igr%rat=@?0P&(}nkJ)bB8sD`7uU#7a< zFEQ!ArGNeqi|$KpPeyGgtVLd)XgZtcb-ix7sg+*#R0-Q@=WE1T+RG|!eWQ<1q8Wl7 zyEK73rev&cIe{as{?ng76^*b657r)}GDk+U>dn7zA2A)9kn%jlhz%LwXgv1496ifA zw%v<4z8%c@(^Y~o+iZZ!Zb|V=qN3m_M+`E}4MS|(UE8$-$1qkWXGQX97q`ErZ|a(D zj`OF&{e~}Oi>qpV6lONfm4(A9-61->-7cgJfF83ecu#p^nJ7|r`vK%dh-l-g10g?U z*Q6?dg%nAL9BGyp=S`4{XNay37FO}SddjXyg!<^Oh0bNq5))Nj&e<$-aCg2gyi#@d zqhzJb`+9C~gtt=wwI#<4>|mS=?i0|6@=s}n$2G_t9esOhGo@8)K&?>R(}R7a9PvI_ zuQs9N5|Q5b zaq)hntsY^xlA)!4)7i;B7U04|+4g-VqyVitB0_CcrN*nnjk{_wHwv9Qv8lZjr{nI{ cW@Dh0p5r1$_D~kK^8lv7Q}hmOqMPUc09Yld(*OVf literal 0 HcmV?d00001 diff --git a/sound/effects/butcher.ogg b/sound/effects/butcher.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2e4a0d2ddc71995b05e2f55b4d981de6496a2097 GIT binary patch literal 9666 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 Zjg{^ELdF2RwSE3Y_oA>X6rlUJ_CK2~E9U?J literal 0 HcmV?d00001 diff --git a/sound/effects/crack1.ogg b/sound/effects/crack1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..aa3bf0ab014cc1098960240391eef2ba82cc3ba2 GIT binary patch literal 7950 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 literal 0 HcmV?d00001 diff --git a/sound/effects/crack2.ogg b/sound/effects/crack2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cef226c98bd0848de3602fb14a07f1de41c19eed GIT binary patch literal 15346 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 Jsqkab{|mdIFYN#T literal 0 HcmV?d00001 diff --git a/sound/effects/dismember.ogg b/sound/effects/dismember.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f5015ad961584f9559945ba0b21f0956fbe9b073 GIT binary patch literal 15382 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 GO8*CsO9tuy literal 0 HcmV?d00001 diff --git a/sound/effects/sizzle1.ogg b/sound/effects/sizzle1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4a3d2290181cf2fe219d0196f441420d133e0105 GIT binary patch literal 52702 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%0Dx5x7!DSAK$8YRZZ<^4K2-Zj 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 Fe*m7re$xN| literal 0 HcmV?d00001 From 74b27645912873570a46e4df839f630663d48ed2 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 18 Jul 2020 03:08:03 +0100 Subject: [PATCH 039/122] sprites and some missed things --- code/modules/clothing/spacesuits/hardsuit.dm | 72 +++++++++--------- .../clothing/spacesuits/miscellaneous.dm | 4 +- code/modules/surgery/bodyparts/parts.dm | 2 + icons/obj/guns/energy.dmi | Bin 45539 -> 46197 bytes 4 files changed, 40 insertions(+), 38 deletions(-) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 695d25dbf4..f563c1029d 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -94,7 +94,7 @@ icon_state = "hardsuit-engineering" item_state = "eng_hardsuit" max_integrity = 300 - armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 50, "acid" = 75) + armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 50, "acid" = 75, "wound" = 10) allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser) siemens_coefficient = 0 var/obj/item/clothing/head/helmet/space/hardsuit/helmet @@ -167,7 +167,7 @@ desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding." icon_state = "hardsuit0-engineering" item_state = "eng_helm" - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75, "wound" = 10) hardsuit_type = "engineering" resistance_flags = FIRE_PROOF @@ -176,7 +176,7 @@ desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding." icon_state = "hardsuit-engineering" item_state = "eng_hardsuit" - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75, "wound" = 10) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine resistance_flags = FIRE_PROOF mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC @@ -188,7 +188,7 @@ icon_state = "hardsuit0-atmospherics" item_state = "atmo_helm" hardsuit_type = "atmospherics" - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 25, "fire" = 100, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 25, "fire" = 100, "acid" = 75, "wound" = 10) heat_protection = HEAD //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -197,7 +197,7 @@ desc = "A special suit that protects against hazardous, low pressure environments. Has thermal shielding." icon_state = "hardsuit-atmospherics" item_state = "atmo_hardsuit" - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 25, "fire" = 100, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 25, "fire" = 100, "acid" = 75, "wound" = 10) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/atmos @@ -209,7 +209,7 @@ icon_state = "hardsuit0-white" item_state = "ce_helm" hardsuit_type = "white" - armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 90) + armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 90, "wound" = 10) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -218,7 +218,7 @@ name = "advanced hardsuit" desc = "An advanced suit that protects against hazardous, low pressure environments. Shines with a high polish." item_state = "ce_hardsuit" - armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 95, "fire" = 100, "acid" = 90) + armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 95, "fire" = 100, "acid" = 90, "wound" = 10) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite @@ -234,7 +234,7 @@ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF heat_protection = HEAD - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 75, "wound" = 15) brightness_on = 7 allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator) @@ -249,7 +249,7 @@ item_state = "mining_hardsuit" max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 75, "wound" = 15) allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/bag/ore, /obj/item/pickaxe) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -267,7 +267,7 @@ icon_state = "hardsuit1-syndi" item_state = "syndie_helm" hardsuit_type = "syndi" - armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90) + armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90, "wound" = 25) on = FALSE var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null actions_types = list(/datum/action/item_action/toggle_helmet_mode) @@ -345,7 +345,7 @@ item_state = "syndie_hardsuit" hardsuit_type = "syndi" w_class = WEIGHT_CLASS_NORMAL - armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90) + armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 90, "wound" = 25) allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi jetpack = /obj/item/tank/jetpack/suit @@ -358,7 +358,7 @@ alt_desc = "An elite version of the syndicate helmet, with improved armour and fireproofing. It is in combat mode. Property of Gorlex Marauders." icon_state = "hardsuit0-syndielite" hardsuit_type = "syndielite" - armor = list("melee" = 60, "bullet" = 60, "laser" = 50, "energy" = 25, "bomb" = 55, "bio" = 100, "rad" = 70, "fire" = 100, "acid" = 100) + armor = list("melee" = 60, "bullet" = 60, "laser" = 50, "energy" = 25, "bomb" = 55, "bio" = 100, "rad" = 70, "fire" = 100, "acid" = 100, "wound" = 25) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -376,7 +376,7 @@ icon_state = "hardsuit0-syndielite" hardsuit_type = "syndielite" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite - armor = list("melee" = 60, "bullet" = 60, "laser" = 50, "energy" = 25, "bomb" = 55, "bio" = 100, "rad" = 70, "fire" = 100, "acid" = 100) + armor = list("melee" = 60, "bullet" = 60, "laser" = 50, "energy" = 25, "bomb" = 55, "bio" = 100, "rad" = 70, "fire" = 100, "acid" = 100, "wound" = 25) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -416,7 +416,7 @@ item_state = "wiz_helm" hardsuit_type = "wiz" resistance_flags = FIRE_PROOF | ACID_PROOF //No longer shall our kind be foiled by lone chemists with spray bottles! - armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 30) heat_protection = HEAD //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -431,7 +431,7 @@ item_state = "wiz_hardsuit" w_class = WEIGHT_CLASS_NORMAL resistance_flags = FIRE_PROOF | ACID_PROOF - armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 30) allowed = list(/obj/item/teleportation_scroll, /obj/item/tank/internals) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -451,7 +451,7 @@ item_state = "medical_helm" hardsuit_type = "medical" flash_protect = 0 - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75, "wound" = 10) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SCAN_REAGENTS @@ -474,7 +474,7 @@ item_state = "medical_hardsuit" slowdown = 0.8 allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/firstaid, /obj/item/healthanalyzer, /obj/item/stack/medical) - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75, "wound" = 10) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/medical mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC @@ -486,7 +486,7 @@ hardsuit_type = "rd" resistance_flags = ACID_PROOF | FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80, "wound" = 15) var/obj/machinery/doppler_array/integrated/bomb_radar clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SCAN_REAGENTS actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_research_scanner) @@ -516,7 +516,7 @@ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT //Same as an emergency firesuit. Not ideal for extended exposure. allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/gun/energy/wormhole_projector, /obj/item/hand_tele, /obj/item/aicard) - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80, "wound" = 15) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/rd //Security hardsuit @@ -526,14 +526,14 @@ icon_state = "hardsuit0-sec" item_state = "sec_helm" hardsuit_type = "sec" - armor = list("melee" = 35, "bullet" = 15, "laser" = 30,"energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75) + armor = list("melee" = 35, "bullet" = 15, "laser" = 30,"energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75, "wound" = 20) /obj/item/clothing/suit/space/hardsuit/security icon_state = "hardsuit-sec" name = "security hardsuit" desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor." item_state = "sec_hardsuit" - armor = list("melee" = 35, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75) + armor = list("melee" = 35, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 75, "acid" = 75, "wound" = 20) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC @@ -547,13 +547,13 @@ desc = "A special bulky helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor." icon_state = "hardsuit0-hos" hardsuit_type = "hos" - armor = list("melee" = 45, "bullet" = 25, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 95, "acid" = 95) + armor = list("melee" = 45, "bullet" = 25, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 95, "acid" = 95, "wound" = 25) /obj/item/clothing/suit/space/hardsuit/security/hos icon_state = "hardsuit-hos" name = "head of security's hardsuit" desc = "A special bulky suit that protects against hazardous, low pressure environments. Has an additional layer of armor." - armor = list("melee" = 45, "bullet" = 25, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 95, "acid" = 95) + armor = list("melee" = 45, "bullet" = 25, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 95, "acid" = 95, "wound" = 25) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos jetpack = /obj/item/tank/jetpack/suit @@ -563,7 +563,7 @@ icon_state = "capspace" item_state = "capspacehelmet" desc = "A tactical SWAT helmet MK.II boasting better protection and a horrible fashion sense." - armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 25, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 25, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 15) resistance_flags = FIRE_PROOF | ACID_PROOF flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR //we want to see the mask heat_protection = HEAD @@ -578,7 +578,7 @@ desc = "A MK.II SWAT suit with streamlined joints and armor made out of superior materials, insulated against intense heat. The most advanced tactical armor available Usually reserved for heavy hitter corporate security, this one has a regal finish in Nanotrasen company colors. Better not let the assistants get a hold of it." icon_state = "caparmor" item_state = "capspacesuit" - armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 25, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 25, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 15) resistance_flags = FIRE_PROOF | ACID_PROOF heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT //this needed to be added a long fucking time ago @@ -594,7 +594,7 @@ desc = "A special helmet designed for work in a hazardous, low-humor environment. Has radiation shielding." icon_state = "hardsuit0-clown" item_state = "hardsuit0-clown" - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 30) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 30, "wound" = 10) hardsuit_type = "clown" /obj/item/clothing/suit/space/hardsuit/clown @@ -602,7 +602,7 @@ desc = "A special suit that protects against hazardous, low humor environments. Has radiation shielding. Only a true clown can wear it." icon_state = "hardsuit-clown" item_state = "clown_hardsuit" - armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 30) + armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 75, "fire" = 60, "acid" = 30, "wound" = 10) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/clown mutantrace_variation = STYLE_DIGITIGRADE @@ -620,7 +620,7 @@ desc = "Early prototype RIG hardsuit helmet, designed to quickly shift over a user's head. Design constraints of the helmet mean it has no inbuilt cameras, thus it restricts the users visability." icon_state = "hardsuit0-ancient" item_state = "anc_helm" - armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75, "wound" = 10) hardsuit_type = "ancient" resistance_flags = FIRE_PROOF @@ -629,7 +629,7 @@ desc = "Prototype powered RIG hardsuit. Provides excellent protection from the elements of space while being comfortable to move around in, thanks to the powered locomotives. Remains very bulky however." icon_state = "hardsuit-ancient" item_state = "anc_hardsuit" - armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75) + armor = list("melee" = 30, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 75, "wound" = 10) slowdown = 3 helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient resistance_flags = FIRE_PROOF @@ -642,7 +642,7 @@ desc = "The Multi-Augmented Severe Operations Networked Resource Integration Gear is an man-portable tank designed for extreme environmental situations. It is excessively bulky, but rated for all but the most atomic of hazards. The specialized armor is surprisingly weak to conventional weaponry. The exo slot can attach most storage bags on to the suit." icon_state = "hardsuit-ancient" item_state = "anc_hardsuit" - armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 10) slowdown = 6 //Slow allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage, /obj/item/construction/rcd, /obj/item/pipe_dispenser) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason @@ -655,7 +655,7 @@ desc = "The M.A.S.O.N RIG helmet is complimentary to the rest of the armor. It features a very large, high powered flood lamp and robust flash protection." icon_state = "hardsuit0-ancient" item_state = "anc_helm" - armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 10) hardsuit_type = "ancient" brightness_on = 16 flash_protect = 5 //We will not be flash by bombs @@ -746,7 +746,7 @@ icon_state = "hardsuit-hos" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos allowed = null - armor = list("melee" = 30, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100) + armor = list("melee" = 30, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 15) resistance_flags = FIRE_PROOF | ACID_PROOF var/max_charges = 3 //How many charges total the shielding has var/current_charges //if null, will default to max_chargs @@ -826,7 +826,7 @@ icon_state = "hardsuit1-syndi" item_state = "syndie_hardsuit" hardsuit_type = "syndi" - armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 30) allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi slowdown = 0 @@ -842,7 +842,7 @@ icon_state = "hardsuit1-syndi" item_state = "syndie_helm" hardsuit_type = "syndi" - armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100) + armor = list("melee" = 40, "bullet" = 50, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 100, "wound" = 30) ///SWAT version /obj/item/clothing/suit/space/hardsuit/shielded/swat @@ -853,7 +853,7 @@ hardsuit_type = "syndi" max_charges = 4 recharge_delay = 15 - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 30) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/swat @@ -865,7 +865,7 @@ icon_state = "deathsquad" item_state = "deathsquad" hardsuit_type = "syndi" - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 30) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT actions_types = list() diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 7df91352ca..ee70f54ed0 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -22,7 +22,7 @@ Contains: desc = "An advanced tactical space helmet." icon_state = "deathsquad" item_state = "deathsquad" - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 30) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -37,7 +37,7 @@ Contains: icon_state = "deathsquad" item_state = "swat_suit" allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/kitchen/knife/combat) - armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "wound" = 30) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index 1a7289b8cc..fde858b7a5 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -71,6 +71,7 @@ px_x = -6 px_y = 0 specific_locations = list("outer left forearm", "inner left wrist", "left elbow", "left bicep", "left shoulder") + aux_icons = list(BODY_ZONE_PRECISE_L_HAND = HANDS_PART_LAYER, "l_hand_behind" = BODY_BEHIND_LAYER) /obj/item/bodypart/l_arm/is_disabled() if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_ARM)) @@ -135,6 +136,7 @@ px_y = 0 max_stamina_damage = 50 specific_locations = list("outer right forearm", "inner right wrist", "right elbow", "right bicep", "right shoulder") + aux_icons = list(BODY_ZONE_PRECISE_R_HAND = HANDS_PART_LAYER, "r_hand_behind" = BODY_BEHIND_LAYER) /obj/item/bodypart/r_arm/is_disabled() if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_ARM)) diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index 33872719fed38d4860cb0c218ebe2eee994fc433..7e7e4a644b607733d27071d4eb12b8a07992b66b 100644 GIT binary patch literal 46197 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≶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 F{vVpJzEc1I literal 45539 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 c&)O#nir&}4?nKqZ`tQI^~+uu1hIKb zQ_yIMcBzq;Ci`5^hO9c&D_mX12h1 z^FVLW7JT|FuSyGYW&?r-fawsDBtER(Bz_yKUan-i{+i%JX>~#%VbwxeX|<0v+~?Ok zIfz&WcvvGSPR4CX`k#H4=?aTk+QshwMfDRAnW zOpU)Se`hfp8dA;#g5d~jA_}7U9UEkL&zua}Tz7J_&cXV}beGMAY7~mPHRjCzQgh`% zxYeP4%fVmHl{)=>;iWS1((^+Qkd}%;TUy;o1cXO`qU`F@xa_|`G|H@CX%zv?5VFN3 zKBj#!eSAGzM9D0+%OPqrb{$Bx8u`DY3!6KJDgutCt?AcjZe0$(4_5+Q#JU1JwFXTp-QEqG1mJ}A^0fN&XoEdY2K~G6j zGe5tJSt*+8NoAw4#N{~dFq)QgZ^A=vj>K69>lp;?v0~s=LW-uzr((v}>wSFK*qDo= zZym}(3G56pyES}V2T$If5>7?hbc5{xAgJ-3DIZD*?A&JEjuz{J@8m-{DN|oUP~z>6 z7IoPEDL(k~_Zwpx%LgcA+Z-^e*Le6)Xp7A0Ou4MKsZZB9p>D{aG>lBISQ`^~$S#;F z%0SI1wDfIzmc0FNPQOvexX|F0>S|GO+=t*Z*rFbL-fx!*^A4p4H5Tf3?z~hun*)|F z58H}QZm8?L_2vm|hQT8&>6ePHCs zt2u-yhYDK~pgpbAN8ks+*;#aJ%cR3FqX)s#yPPzi)|JI)!cJ`XXfVY1E_zV12fvRz z%tFvzOX9fDSubH?d5M{ki@H^wS@_@Tj|G%_X?gj>vV9 z4i1f914a}KFylLSQgU(<0S*%YDB1K&wpd?!8ospeyCyh2b$;>pQ8Dq2upDt^usW=u z&;f;ANe?m{dyb~*MBwo|>`#eSS)rSgXj&g^_NVzM16nc?$z@B(Ka3I{DYJY zHR9Tw6gjZk9lbARa{+N~`2*gFJ{~^$L*BBLAhEbsbm&OxeKgk6&HxKT_6997K2Chx ztFG03Kkm_0ip?ryv8MI*N;_utgJM83C^8^9Moqd(JmmrS^42TI%pb`~VpBd1VbFEo z)23@JAwv!j>V}zF1|Ag3p#XX;gsYw)T^5ozM*DoRpGNtDGRsF6Upk$I-ze`OkH1^s zC^pU;1Z$e)>b~wpulcmv&^8PEqt=EifMPGQ==Eh|Y`P;%1qggYO%WyEAN9fygMab` zH-!2YaKLU0G3Mvz2Xo(??OywKf_r=KXuJj1U5#5D%W@1c{JPA}b(KzfbQDb4>CBU2 znVHi_@N%^Dlc{q4EUL7p ztGbpfjaIp#=9((BTngiM`*k6m!KnJFPj7ELLj(C39e96jCM7SzQONljB65YGWUQ>} z5Aldx@V1=o*LSnitqyhjz_RxO1UnWGIK<>qA)Xe69C6A$V#8~bSXP=n0W#p?dOBSk z&JXz z*|ypu=+N69Q5iN)Kl=8nRy-vw5|mFq$d}KK84cZgBquuWsNCxNg!ls`N=xObM{@M= zmoG2CB5(6(+Een^;E&lY{+Z{2OEAK6sjMM3c~1fGXvUMLteTvn$SK>1JAFO{ouWOa zN?+>hg0+#5n{5)ZS9ZzBD`2sGL3F`E-^ zNlIVAUrR$@fRa&}!qUMnCB0c-WVGA~pxiJ%KK>RIrOqB5%2vG62CJpZk<4p7hz<6< zHLuPbq^ zc;I2w={-l|?YJ6;zAl$~3TQLH5m*K4|DI{A9vc&DLw8Z$ad6B(FU$x z9`48`JU%lRe?`1P?!>z+Ip2xn|H&GP3!I|8AF{Ys-KZLR&WI7T!i(QBg*TC=?SCp* oz-Q>%|EmQb@Erb|^&%XPfM{*QO#yCx2>iRHp|4(b(>CJ&0L<(>4*&oF From 0e38e1ff39331500ab64f11ae401fb804f3a474f Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Sat, 18 Jul 2020 16:03:32 +1000 Subject: [PATCH 040/122] e --- code/game/objects/items/RSF.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm index 01b351edd0..e2bbdf0f04 100644 --- a/code/game/objects/items/RSF.dm +++ b/code/game/objects/items/RSF.dm @@ -26,6 +26,11 @@ RSF /obj/item/rsf/cyborg matter = 30 +/obj/item/rsf/cyborg/Initialize() + if(matter > 30) + matter = 30 + ..() + /obj/item/rsf/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/rcd_ammo)) if((matter + 10) > 30) From f84b044f341167cbf63e4e80ee6719d58d76240a Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Sat, 18 Jul 2020 16:05:57 +1000 Subject: [PATCH 041/122] Update robot_modules.dm --- code/modules/mob/living/silicon/robot/robot_modules.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index ccf38a547b..4bff48a650 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -779,9 +779,8 @@ /obj/item/toy/crayon/spraycan/borg, /obj/item/hand_labeler/borg, /obj/item/razor, - /obj/item/rsf, - /obj/item/instrument/violin, - /obj/item/instrument/guitar, + /obj/item/rsf/cyborg, + /obj/item/instrument/synthesizer, /obj/item/reagent_containers/dropper, /obj/item/lighter, /obj/item/storage/bag/tray, From f696a461afcc30ddbc327ce73b23f69df89de943 Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Sat, 18 Jul 2020 16:10:25 +1000 Subject: [PATCH 042/122] Update RSF.dm --- code/game/objects/items/RSF.dm | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm index e2bbdf0f04..79fa080269 100644 --- a/code/game/objects/items/RSF.dm +++ b/code/game/objects/items/RSF.dm @@ -26,10 +26,6 @@ RSF /obj/item/rsf/cyborg matter = 30 -/obj/item/rsf/cyborg/Initialize() - if(matter > 30) - matter = 30 - ..() /obj/item/rsf/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/rcd_ammo)) @@ -69,15 +65,16 @@ RSF return if (!(istype(A, /obj/structure/table) || isfloorturf(A))) return - - if(matter < 1) - to_chat(user, "\The [src] doesn't have enough matter left.") - return if(iscyborg(user)) + matter = 30 //borgs dont actually use the matter so this is mostly just so it doesnt fail the next check incase of shennanigans var/mob/living/silicon/robot/R = user if(!R.cell || R.cell.charge < 200) to_chat(user, "You do not have enough power to use [src].") return + if(matter < 1) + to_chat(user, "\The [src] doesn't have enough matter left.") + return + var/turf/T = get_turf(A) playsound(src.loc, 'sound/machines/click.ogg', 10, 1) From 55ed77a89d1513139bc8e605cd1dd0943e6581bf Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Sat, 18 Jul 2020 16:15:47 +1000 Subject: [PATCH 043/122] Update robot_modules.dm --- code/modules/mob/living/silicon/robot/robot_modules.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 4bff48a650..cd3601942c 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -780,7 +780,7 @@ /obj/item/hand_labeler/borg, /obj/item/razor, /obj/item/rsf/cyborg, - /obj/item/instrument/synthesizer, + /obj/item/instrument/piano_synth, /obj/item/reagent_containers/dropper, /obj/item/lighter, /obj/item/storage/bag/tray, From c39a5175193fbed929d42e5fd223a0178646cbbe Mon Sep 17 00:00:00 2001 From: kappa-sama <44128284+kappa-sama@users.noreply.github.com> Date: Sat, 18 Jul 2020 03:47:31 -0400 Subject: [PATCH 044/122] nerf this --- code/game/objects/items/storage/backpack.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index b989398e53..99dbde2364 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -502,7 +502,6 @@ new /obj/item/retractor/advanced(src) new /obj/item/surgicaldrill/advanced(src) new /obj/item/surgical_drapes(src) - new /obj/item/storage/firstaid/tactical(src) new /obj/item/clothing/suit/straight_jacket(src) new /obj/item/clothing/mask/muzzle(src) new /obj/item/mmi/syndie(src) From 0364fe857936711aef02a4a49e3c2d8063ba80d7 Mon Sep 17 00:00:00 2001 From: kappa-sama <44128284+kappa-sama@users.noreply.github.com> Date: Sat, 18 Jul 2020 03:50:17 -0400 Subject: [PATCH 045/122] lower cost --- code/modules/uplink/uplink_items/uplink_devices.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/uplink/uplink_items/uplink_devices.dm b/code/modules/uplink/uplink_items/uplink_devices.dm index df6373b8de..5d19a3959c 100644 --- a/code/modules/uplink/uplink_items/uplink_devices.dm +++ b/code/modules/uplink/uplink_items/uplink_devices.dm @@ -230,10 +230,9 @@ /datum/uplink_item/device_tools/surgerybag_adv name = "Advanced Syndicate Surgery Duffel Bag" - desc = "The Syndicate surgery duffel bag is a toolkit containing all advanced surgery tools, surgical drapes, \ - a Syndicate brand MMI, a straitjacket, a muzzle, and an outdated, yet still useful Combat Medic Kit." + desc = "A Syndicate surgery duffel bag, with a set of upgraded surgery tools to boot." item = /obj/item/storage/backpack/duffelbag/syndie/surgery_adv - cost = 10 + cost = 7 /datum/uplink_item/device_tools/brainwash_disk name = "Brainwashing Surgery Program" From 56f56d5cbe4804e9a0123fbeb1de0a2e6a3f65b0 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 18 Jul 2020 10:24:36 -0700 Subject: [PATCH 046/122] Update gateway.dm --- code/modules/awaymissions/gateway.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 6ddda43bc8..157fdb7bc7 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -188,7 +188,8 @@ GLOBAL_LIST_EMPTY(gateway_destinations) target = null dest.deactivate(src) QDEL_NULL(portal) - use_power = IDLE_POWER_USE + if(use_power == ACTIVE_POWER_USE) + use_power = IDLE_POWER_USE update_icon() /obj/machinery/gateway/process() @@ -216,7 +217,8 @@ GLOBAL_LIST_EMPTY(gateway_destinations) target = D target.activate(destination) generate_bumper() - use_power = ACTIVE_POWER_USE + if(use_power == IDLE_POWER_USE) + use_power = ACTIVE_POWER_USE update_icon() /obj/machinery/gateway/proc/Transfer(atom/movable/AM) From fe79c53f04d03ad8796d91cb7a7252c643907f5c Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 18 Jul 2020 21:40:19 +0100 Subject: [PATCH 047/122] bugfixes --- code/datums/wounds/burns.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 83 +++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm index feff9bf4de..6a6629a0c9 100644 --- a/code/datums/wounds/burns.dm +++ b/code/datums/wounds/burns.dm @@ -186,7 +186,7 @@ /// if someone is using ointment on our burns /datum/wound/burn/proc/ointment(obj/item/stack/medical/ointment/I, mob/user) user.visible_message("[user] begins applying [I] to [victim]'s [limb.name]...", "You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.name]...") - if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), extra_checks = CALLBACK(src, .proc/still_exists))) + if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), target = victim)) return limb.heal_damage(I.heal_brute, I.heal_burn) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 714932af80..af1afb0f81 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -762,6 +762,89 @@ ..() +/mob/living/carbon/human/check_self_for_injuries() + if(stat == DEAD || stat == UNCONSCIOUS) + return + + visible_message("[src] examines [p_them()]self.", \ + "You check yourself for injuries.") + + var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + + for(var/X in bodyparts) + var/obj/item/bodypart/LB = X + missing -= LB.body_zone + if(LB.is_pseudopart) //don't show injury text for fake bodyparts; ie chainsaw arms or synthetic armblades + continue + var/self_aware = FALSE + if(HAS_TRAIT(src, TRAIT_SELF_AWARE)) + self_aware = TRUE + var/limb_max_damage = LB.max_damage + var/status = "" + var/brutedamage = LB.brute_dam + var/burndamage = LB.burn_dam + if(hallucination) + if(prob(30)) + brutedamage += rand(30,40) + if(prob(30)) + burndamage += rand(30,40) + + if(HAS_TRAIT(src, TRAIT_SELF_AWARE)) + status = "[brutedamage] brute damage and [burndamage] burn damage" + if(!brutedamage && !burndamage) + status = "no damage" + + else + if(brutedamage > 0) + status = LB.light_brute_msg + if(brutedamage > (limb_max_damage*0.4)) + status = LB.medium_brute_msg + if(brutedamage > (limb_max_damage*0.8)) + status = LB.heavy_brute_msg + if(brutedamage > 0 && burndamage > 0) + status += " and " + + if(burndamage > (limb_max_damage*0.8)) + status += LB.heavy_burn_msg + else if(burndamage > (limb_max_damage*0.2)) + status += LB.medium_burn_msg + else if(burndamage > 0) + status += LB.light_burn_msg + + if(status == "") + status = "OK" + var/no_damage + if(status == "OK" || status == "no damage") + no_damage = TRUE + var/isdisabled = " " + if(LB.is_disabled()) + isdisabled = " is disabled " + if(no_damage) + isdisabled += " but otherwise " + else + isdisabled += " and " + to_chat(src, "\t Your [LB.name][isdisabled][self_aware ? " has " : " is "][status].") + + for(var/thing in LB.wounds) + var/datum/wound/W = thing + var/msg + switch(W.severity) + if(WOUND_SEVERITY_TRIVIAL) + msg = "\t Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]." + if(WOUND_SEVERITY_MODERATE) + msg = "\t Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!" + if(WOUND_SEVERITY_SEVERE) + msg = "\t Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!" + if(WOUND_SEVERITY_CRITICAL) + msg = "\t Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!!" + to_chat(src, msg) + + for(var/obj/item/I in LB.embedded_objects) + if(I.isEmbedHarmless()) + to_chat(src, "\t There is \a [I] stuck to your [LB.name]!") + else + to_chat(src, "\t There is \a [I] embedded in your [LB.name]!") + /mob/living/carbon/human/damage_clothes(damage_amount, damage_type = BRUTE, damage_flag = 0, def_zone) if(damage_type != BRUTE && damage_type != BURN) From b184cfefc53cbf28998c238901313910f155d95f Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 18 Jul 2020 22:00:28 +0100 Subject: [PATCH 048/122] imagine allowing wound healing --- code/modules/mob/living/carbon/carbon_defense.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 4aac8af0ac..18e38ae44d 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -132,9 +132,9 @@ if(S.next_step(user, user.a_intent)) return TRUE - for(var/datum/wound/W in all_wounds) - if(W.try_handling(user)) - return 1 + for(var/datum/wound/W in all_wounds) + if(W.try_handling(user)) + return 1 /mob/living/carbon/attack_paw(mob/living/carbon/monkey/M) From de83bbee0bfe8ce54585ba4ce575723e3922c532 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 18 Jul 2020 22:02:07 +0100 Subject: [PATCH 049/122] woops --- code/game/objects/items/stacks/medical.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 1e70b4bd80..32093a8d1c 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -221,7 +221,6 @@ return FALSE user.visible_message("[user] applies \the [src] on [M].", "You apply \the [src] on [M].") return heal_carbon(M, user, heal_brute, heal_burn) - return TRUE to_chat(user, "You can't heal [M] with \the [src]!") From c1ac3bae6e450d8dfb25fca83caedba4be37b38b Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 18 Jul 2020 22:06:07 +0100 Subject: [PATCH 050/122] appease travis --- code/datums/status_effects/wound_effects.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm index 751a3508a3..cb23258118 100644 --- a/code/datums/status_effects/wound_effects.dm +++ b/code/datums/status_effects/wound_effects.dm @@ -124,12 +124,13 @@ linked_wound = null linked_limb = null UnregisterSignal(owner, COMSIG_CARBON_LOSE_WOUND) + return ..() /datum/status_effect/wound/on_apply() if(!iscarbon(owner)) return FALSE RegisterSignal(owner, COMSIG_CARBON_LOSE_WOUND, .proc/check_remove) - return TRUE + return ..() /// check if the wound getting removed is the wound we're tied to /datum/status_effect/wound/proc/check_remove(mob/living/L, datum/wound/W) From b712538e6954760285649fc49f87462a8904c7e1 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 18 Jul 2020 22:10:08 +0100 Subject: [PATCH 051/122] travis please --- code/datums/status_effects/wound_effects.dm | 3 ++- tgstation.dme | 15 +++++---------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm index cb23258118..062c015052 100644 --- a/code/datums/status_effects/wound_effects.dm +++ b/code/datums/status_effects/wound_effects.dm @@ -43,10 +43,11 @@ update_limp() RegisterSignal(C, COMSIG_MOVABLE_MOVED, .proc/check_step) RegisterSignal(C, list(COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB), .proc/update_limp) - return TRUE + return ..() /datum/status_effect/limp/on_remove() UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB)) + ..() /obj/screen/alert/status_effect/limp name = "Limping" diff --git a/tgstation.dme b/tgstation.dme index 2d0fcd0063..cc592a50cc 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -240,7 +240,6 @@ #include "code\_onclick\hud\hud.dm" #include "code\_onclick\hud\human.dm" #include "code\_onclick\hud\lavaland_elite.dm" -#include "code\_onclick\hud\map_popups.dm" #include "code\_onclick\hud\monkey.dm" #include "code\_onclick\hud\movable_screen_objects.dm" #include "code\_onclick\hud\parallax.dm" @@ -458,7 +457,7 @@ #include "code\datums\components\virtual_reality.dm" #include "code\datums\components\wearertargeting.dm" #include "code\datums\components\wet_floor.dm" -#include "code\datums\components\crafting\crafting.dm" +#include "code\datums\components\crafting\craft.dm" #include "code\datums\components\crafting\guncrafting.dm" #include "code\datums\components\crafting\recipes.dm" #include "code\datums\components\crafting\glassware\glassware.dm" @@ -1130,7 +1129,6 @@ #include "code\game\objects\items\stacks\stack.dm" #include "code\game\objects\items\stacks\tape.dm" #include "code\game\objects\items\stacks\telecrystal.dm" -#include "code\game\objects\items\stacks\tickets.dm" #include "code\game\objects\items\stacks\wrap.dm" #include "code\game\objects\items\stacks\sheets\glass.dm" #include "code\game\objects\items\stacks\sheets\leather.dm" @@ -1359,7 +1357,6 @@ #include "code\modules\admin\verbs\pray.dm" #include "code\modules\admin\verbs\randomverbs.dm" #include "code\modules\admin\verbs\reestablish_db_connection.dm" -#include "code\modules\admin\verbs\shuttlepanel.dm" #include "code\modules\admin\verbs\spawnobjasmob.dm" #include "code\modules\admin\verbs\tripAI.dm" #include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" @@ -2364,7 +2361,6 @@ #include "code\modules\mob\dead\observer\notificationprefs.dm" #include "code\modules\mob\dead\observer\observer.dm" #include "code\modules\mob\dead\observer\observer_movement.dm" -#include "code\modules\mob\dead\observer\orbit.dm" #include "code\modules\mob\dead\observer\say.dm" #include "code\modules\mob\living\blood.dm" #include "code\modules\mob\living\bloodcrawl.dm" @@ -2553,7 +2549,6 @@ #include "code\modules\mob\living\simple_animal\corpse.dm" #include "code\modules\mob\living\simple_animal\damage_procs.dm" #include "code\modules\mob\living\simple_animal\parrot.dm" -#include "code\modules\mob\living\simple_animal\pickle.dm" #include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" #include "code\modules\mob\living\simple_animal\simple_animal_vr.dm" @@ -2711,7 +2706,6 @@ #include "code\modules\modular_computers\file_system\program_events.dm" #include "code\modules\modular_computers\file_system\programs\airestorer.dm" #include "code\modules\modular_computers\file_system\programs\alarm.dm" -#include "code\modules\modular_computers\file_system\programs\arcade.dm" #include "code\modules\modular_computers\file_system\programs\card.dm" #include "code\modules\modular_computers\file_system\programs\configurator.dm" #include "code\modules\modular_computers\file_system\programs\file_browser.dm" @@ -2720,8 +2714,6 @@ #include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm" #include "code\modules\modular_computers\file_system\programs\nttransfer.dm" #include "code\modules\modular_computers\file_system\programs\powermonitor.dm" -#include "code\modules\modular_computers\file_system\programs\radar.dm" -#include "code\modules\modular_computers\file_system\programs\robocontrol.dm" #include "code\modules\modular_computers\file_system\programs\sm_monitor.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\contract_uplink.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" @@ -2780,6 +2772,10 @@ #include "code\modules\NTNet\network.dm" #include "code\modules\NTNet\relays.dm" #include "code\modules\NTNet\services\_service.dm" +#include "code\modules\oracle_ui\assets.dm" +#include "code\modules\oracle_ui\hookup_procs.dm" +#include "code\modules\oracle_ui\oracle_ui.dm" +#include "code\modules\oracle_ui\themed.dm" #include "code\modules\paperwork\clipboard.dm" #include "code\modules\paperwork\contract.dm" #include "code\modules\paperwork\filingcabinet.dm" @@ -3340,7 +3336,6 @@ #include "code\modules\tgui\states\contained.dm" #include "code\modules\tgui\states\deep_inventory.dm" #include "code\modules\tgui\states\default.dm" -#include "code\modules\tgui\states\default_contained.dm" #include "code\modules\tgui\states\hands.dm" #include "code\modules\tgui\states\human_adjacent.dm" #include "code\modules\tgui\states\inventory.dm" From 35b5c019a5ec99725371874a22d91671cdd935f1 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 18 Jul 2020 22:12:01 +0100 Subject: [PATCH 052/122] Revert "travis please" This reverts commit b712538e6954760285649fc49f87462a8904c7e1. --- code/datums/status_effects/wound_effects.dm | 3 +-- tgstation.dme | 15 ++++++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm index 062c015052..cb23258118 100644 --- a/code/datums/status_effects/wound_effects.dm +++ b/code/datums/status_effects/wound_effects.dm @@ -43,11 +43,10 @@ update_limp() RegisterSignal(C, COMSIG_MOVABLE_MOVED, .proc/check_step) RegisterSignal(C, list(COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB), .proc/update_limp) - return ..() + return TRUE /datum/status_effect/limp/on_remove() UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB)) - ..() /obj/screen/alert/status_effect/limp name = "Limping" diff --git a/tgstation.dme b/tgstation.dme index cc592a50cc..2d0fcd0063 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -240,6 +240,7 @@ #include "code\_onclick\hud\hud.dm" #include "code\_onclick\hud\human.dm" #include "code\_onclick\hud\lavaland_elite.dm" +#include "code\_onclick\hud\map_popups.dm" #include "code\_onclick\hud\monkey.dm" #include "code\_onclick\hud\movable_screen_objects.dm" #include "code\_onclick\hud\parallax.dm" @@ -457,7 +458,7 @@ #include "code\datums\components\virtual_reality.dm" #include "code\datums\components\wearertargeting.dm" #include "code\datums\components\wet_floor.dm" -#include "code\datums\components\crafting\craft.dm" +#include "code\datums\components\crafting\crafting.dm" #include "code\datums\components\crafting\guncrafting.dm" #include "code\datums\components\crafting\recipes.dm" #include "code\datums\components\crafting\glassware\glassware.dm" @@ -1129,6 +1130,7 @@ #include "code\game\objects\items\stacks\stack.dm" #include "code\game\objects\items\stacks\tape.dm" #include "code\game\objects\items\stacks\telecrystal.dm" +#include "code\game\objects\items\stacks\tickets.dm" #include "code\game\objects\items\stacks\wrap.dm" #include "code\game\objects\items\stacks\sheets\glass.dm" #include "code\game\objects\items\stacks\sheets\leather.dm" @@ -1357,6 +1359,7 @@ #include "code\modules\admin\verbs\pray.dm" #include "code\modules\admin\verbs\randomverbs.dm" #include "code\modules\admin\verbs\reestablish_db_connection.dm" +#include "code\modules\admin\verbs\shuttlepanel.dm" #include "code\modules\admin\verbs\spawnobjasmob.dm" #include "code\modules\admin\verbs\tripAI.dm" #include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" @@ -2361,6 +2364,7 @@ #include "code\modules\mob\dead\observer\notificationprefs.dm" #include "code\modules\mob\dead\observer\observer.dm" #include "code\modules\mob\dead\observer\observer_movement.dm" +#include "code\modules\mob\dead\observer\orbit.dm" #include "code\modules\mob\dead\observer\say.dm" #include "code\modules\mob\living\blood.dm" #include "code\modules\mob\living\bloodcrawl.dm" @@ -2549,6 +2553,7 @@ #include "code\modules\mob\living\simple_animal\corpse.dm" #include "code\modules\mob\living\simple_animal\damage_procs.dm" #include "code\modules\mob\living\simple_animal\parrot.dm" +#include "code\modules\mob\living\simple_animal\pickle.dm" #include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" #include "code\modules\mob\living\simple_animal\simple_animal_vr.dm" @@ -2706,6 +2711,7 @@ #include "code\modules\modular_computers\file_system\program_events.dm" #include "code\modules\modular_computers\file_system\programs\airestorer.dm" #include "code\modules\modular_computers\file_system\programs\alarm.dm" +#include "code\modules\modular_computers\file_system\programs\arcade.dm" #include "code\modules\modular_computers\file_system\programs\card.dm" #include "code\modules\modular_computers\file_system\programs\configurator.dm" #include "code\modules\modular_computers\file_system\programs\file_browser.dm" @@ -2714,6 +2720,8 @@ #include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm" #include "code\modules\modular_computers\file_system\programs\nttransfer.dm" #include "code\modules\modular_computers\file_system\programs\powermonitor.dm" +#include "code\modules\modular_computers\file_system\programs\radar.dm" +#include "code\modules\modular_computers\file_system\programs\robocontrol.dm" #include "code\modules\modular_computers\file_system\programs\sm_monitor.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\contract_uplink.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" @@ -2772,10 +2780,6 @@ #include "code\modules\NTNet\network.dm" #include "code\modules\NTNet\relays.dm" #include "code\modules\NTNet\services\_service.dm" -#include "code\modules\oracle_ui\assets.dm" -#include "code\modules\oracle_ui\hookup_procs.dm" -#include "code\modules\oracle_ui\oracle_ui.dm" -#include "code\modules\oracle_ui\themed.dm" #include "code\modules\paperwork\clipboard.dm" #include "code\modules\paperwork\contract.dm" #include "code\modules\paperwork\filingcabinet.dm" @@ -3336,6 +3340,7 @@ #include "code\modules\tgui\states\contained.dm" #include "code\modules\tgui\states\deep_inventory.dm" #include "code\modules\tgui\states\default.dm" +#include "code\modules\tgui\states\default_contained.dm" #include "code\modules\tgui\states\hands.dm" #include "code\modules\tgui\states\human_adjacent.dm" #include "code\modules\tgui\states\inventory.dm" From 50b346355c6adacf74b01886d0648d5b7ce8d91e Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 18 Jul 2020 22:13:15 +0100 Subject: [PATCH 053/122] fixes travis but without dm fucking up --- code/datums/status_effects/wound_effects.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm index cb23258118..2c0c030425 100644 --- a/code/datums/status_effects/wound_effects.dm +++ b/code/datums/status_effects/wound_effects.dm @@ -43,10 +43,11 @@ update_limp() RegisterSignal(C, COMSIG_MOVABLE_MOVED, .proc/check_step) RegisterSignal(C, list(COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB), .proc/update_limp) - return TRUE + return ..() /datum/status_effect/limp/on_remove() UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB)) + return ..() /obj/screen/alert/status_effect/limp name = "Limping" From 74eadcf9c2f259f13f0a8a241cdf2e0752ae5016 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 18 Jul 2020 22:25:42 +0100 Subject: [PATCH 054/122] removes a singular full stop --- code/modules/clothing/clothing.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index e12a8fb1e5..d2553c4d7c 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -58,7 +58,6 @@ var/limb_integrity = 0 // How many zones (body parts, not precise) we have disabled so far, for naming purposes var/zones_disabled - . /obj/item/clothing/Initialize() . = ..() From 345c5c593d6411ad55306ece848eab3df35dedca Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 18 Jul 2020 22:31:52 +0100 Subject: [PATCH 055/122] everyone but slimes can scar basically --- code/modules/mob/living/carbon/human/species.dm | 2 +- code/modules/mob/living/carbon/human/species_types/abductors.dm | 2 +- code/modules/mob/living/carbon/human/species_types/angel.dm | 2 +- code/modules/mob/living/carbon/human/species_types/bugmen.dm | 2 +- code/modules/mob/living/carbon/human/species_types/dullahan.dm | 2 +- code/modules/mob/living/carbon/human/species_types/dwarves.dm | 2 +- code/modules/mob/living/carbon/human/species_types/flypeople.dm | 2 +- .../mob/living/carbon/human/species_types/furrypeople.dm | 2 +- .../mob/living/carbon/human/species_types/shadowpeople.dm | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index cd83fc6f48..f2d9554054 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -73,7 +73,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/datum/outfit/outfit_important_for_life // A path to an outfit that is important for species life e.g. plasmaman outfit // species-only traits. Can be found in DNA.dm - var/list/species_traits = list() + var/list/species_traits = list(CAN_SCAR) //by default they can scar unless set to something else // generic traits tied to having the species var/list/inherent_traits = list() var/inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index 0899038da4..409781efb2 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -3,7 +3,7 @@ id = "abductor" say_mod = "gibbers" sexes = FALSE - species_traits = list(NOBLOOD,NOEYES,NOGENITALS,NOAROUSAL) + species_traits = list(NOBLOOD,NOEYES,NOGENITALS,NOAROUSAL,CAN_SCAR) inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_CHUNKYFINGERS,TRAIT_NOHUNGER,TRAIT_NOBREATH) mutanttongue = /obj/item/organ/tongue/abductor diff --git a/code/modules/mob/living/carbon/human/species_types/angel.dm b/code/modules/mob/living/carbon/human/species_types/angel.dm index 1a92da3b0a..2d43c9964e 100644 --- a/code/modules/mob/living/carbon/human/species_types/angel.dm +++ b/code/modules/mob/living/carbon/human/species_types/angel.dm @@ -2,7 +2,7 @@ name = "Angel" id = "angel" default_color = "FFFFFF" - species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS) + species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,CAN_SCAR) mutant_bodyparts = list("tail_human" = "None", "ears" = "None", "wings" = "Angel") use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM no_equip = list(SLOT_BACK) diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm index a79f9e2392..6a9e9d0b13 100644 --- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm @@ -3,7 +3,7 @@ id = "insect" say_mod = "chitters" default_color = "00FF00" - species_traits = list(LIPS,EYECOLOR,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR) + species_traits = list(LIPS,EYECOLOR,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR,CAN_SCAR) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG mutant_bodyparts = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "insect_wings" = "None", "insect_fluff" = "None", "mam_snouts" = "None", "taur" = "None", "insect_markings" = "None") diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index 1d19f28aa8..4e5aa57b0a 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -3,7 +3,7 @@ id = "dullahan" default_color = "FFFFFF" species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS) - inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH) + inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH,CAN_SCAR) mutant_bodyparts = list("tail_human" = "None", "ears" = "None", "deco_wings" = "None") use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM mutant_brain = /obj/item/organ/brain/dullahan diff --git a/code/modules/mob/living/carbon/human/species_types/dwarves.dm b/code/modules/mob/living/carbon/human/species_types/dwarves.dm index 7ca057711e..009dba7707 100644 --- a/code/modules/mob/living/carbon/human/species_types/dwarves.dm +++ b/code/modules/mob/living/carbon/human/species_types/dwarves.dm @@ -6,7 +6,7 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) // name = "Dwarf" id = "dwarf" //Also called Homo sapiens pumilionis default_color = "FFFFFF" - species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS) + species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,CAN_SCAR) inherent_traits = list(TRAIT_DWARF,TRAIT_SNOB) limbs_id = "human" use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index dbf097196d..c3ec8b42ea 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -2,7 +2,7 @@ name = "Anthromorphic Fly" id = "fly" say_mod = "buzzes" - species_traits = list(NOEYES) + species_traits = list(NOEYES,CAN_SCAR) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG mutanttongue = /obj/item/organ/tongue/fly mutantliver = /obj/item/organ/liver/fly diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index b6d56b8e5d..9520d77015 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -3,7 +3,7 @@ id = "mammal" default_color = "4B4B4B" icon_limbs = DEFAULT_BODYPART_ICON_CITADEL - species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR,WINGCOLOR) + species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR,WINGCOLOR,CAN_SCAR) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BEAST mutant_bodyparts = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None", "mam_body_markings" = "Husky", "taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian") diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index da03340ff9..2776c6d919 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -9,7 +9,7 @@ blacklisted = 1 ignored_by = list(/mob/living/simple_animal/hostile/faithless) meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/shadow - species_traits = list(NOBLOOD,NOEYES) + species_traits = list(NOBLOOD,NOEYES,CAN_SCAR) inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH,CAN_SCAR) dangerous_existence = 1 From 3b78ac58bd5b5836ac85b43bf4cb341e22b7038c Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 18 Jul 2020 22:46:07 +0100 Subject: [PATCH 056/122] make it clearer --- code/game/objects/items/stacks/medical.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 32093a8d1c..0e1a87b81f 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -339,7 +339,7 @@ novariants = TRUE /obj/item/stack/medical/bone_gel/attack(mob/living/M, mob/user) - to_chat(user, "Bone gel can only be used on fractured limbs!") + to_chat(user, "Bone gel can only be used on fractured limbs while aggressively holding someone!") return /obj/item/stack/medical/bone_gel/suicide_act(mob/user) From 16957d78e903714bc7f68a38a36455d9566ed5b0 Mon Sep 17 00:00:00 2001 From: TheSpaghetti <37235090+TheSpaghetti@users.noreply.github.com> Date: Sat, 18 Jul 2020 18:11:48 -0400 Subject: [PATCH 057/122] Makes the grammar bad again. For some reason the fixed grammar didn't compile. --- code/datums/traits/negative.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 1566baa421..8f902fa088 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -173,9 +173,9 @@ GLOBAL_LIST_EMPTY(family_heirlooms) name = "Light Sensitivity" desc = "Bright lights irritate you. Your eyes start to water, your skin feels itchy against the photon radiation, and your hair gets dry and frizzy. Maybe it's a medical condition. If only Nanotrasen was more considerate of your needs..." value = -1 - gain_text = "The safety of light feels off..." + gain_text = "The safty of light feels off..." lose_text = "Enlightening." - medical_record_text = "Despite my warnings, the patient refuses to turn on the lights, only to end up rolling down a full flight of stairs and into the cellar." + medical_record_text = "Despite my warnings, the patient refuses turn on the lights, only to end up rolling down a full flight of stairs and into the cellar." /datum/quirk/lightless/on_process() var/turf/T = get_turf(quirk_holder) From a89a55a0cccdd13ab260464f581524b14d7e505d Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 18 Jul 2020 23:23:25 +0100 Subject: [PATCH 058/122] indentation fix --- code/_onclick/other_mobs.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index c1459e02f1..48b652b6f3 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -10,11 +10,11 @@ if(!has_active_hand()) //can't attack without a hand. to_chat(src, "You look at your arm and sigh.") return - - var/obj/item/bodypart/check_arm = get_active_hand() - if(check_arm && check_arm.is_disabled() == BODYPART_DISABLED_WOUND) - to_chat(src, "The damage in your [check_arm.name] is preventing you from using it! Get it fixed, or at least splinted!") - return + + var/obj/item/bodypart/check_arm = get_active_hand() + if(check_arm && check_arm.is_disabled() == BODYPART_DISABLED_WOUND) + to_chat(src, "The damage in your [check_arm.name] is preventing you from using it! Get it fixed, or at least splinted!") + return // Special glove functions: // If the gloves do anything, have them return 1 to stop From de5e87d522e640d3d3c354bcda7471adb747c1e1 Mon Sep 17 00:00:00 2001 From: Artur Date: Sun, 19 Jul 2020 02:37:11 +0300 Subject: [PATCH 059/122] Fixes a typo --- .../antagonists/bloodsucker/objects/bloodsucker_coffin.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm index e85d3af5a0..a555677719 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm @@ -110,7 +110,7 @@ if (bloodsuckerdatum && bloodsuckerdatum.coffin == src) bloodsuckerdatum.coffin = null bloodsuckerdatum.lair = null - to_chat(resident, "You sense that the link with your coffin, your sacred place of rest, has been brokem! You will need to seek another.") + to_chat(resident, "You sense that the link with your coffin, your sacred place of rest, has been broken! You will need to seek another.") resident = null // Remove resident. Because this object isnt removed from the game immediately (GC?) we need to give them a way to see they don't have a home anymore. /obj/structure/closet/crate/coffin/can_open(mob/living/user) From 19dd73f9b4b81b6c10ab06904e1e6ddf2d49ccc3 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 19 Jul 2020 00:10:43 +0000 Subject: [PATCH 060/122] Automatic changelog compile [ci skip] --- html/changelog.html | 47 ++++++++++++++++++++++ html/changelogs/.all_changelog.yml | 30 ++++++++++++++ html/changelogs/AutoChangeLog-pr-12229.yml | 4 -- html/changelogs/AutoChangeLog-pr-12679.yml | 4 -- html/changelogs/AutoChangeLog-pr-12733.yml | 4 -- html/changelogs/AutoChangeLog-pr-12750.yml | 4 -- html/changelogs/AutoChangeLog-pr-12758.yml | 4 -- html/changelogs/AutoChangeLog-pr-12759.yml | 4 -- html/changelogs/AutoChangeLog-pr-12761.yml | 6 --- html/changelogs/AutoChangeLog-pr-12762.yml | 4 -- html/changelogs/AutoChangeLog-pr-12763.yml | 4 -- html/changelogs/AutoChangeLog-pr-12775.yml | 4 -- html/changelogs/AutoChangeLog-pr-12776.yml | 4 -- html/changelogs/AutoChangeLog-pr-12779.yml | 4 -- html/changelogs/AutoChangeLog-pr-12812.yml | 4 -- 15 files changed, 77 insertions(+), 54 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-12229.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12679.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12733.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12750.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12758.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12759.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12761.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12762.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12763.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12775.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12776.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12779.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12812.yml diff --git a/html/changelog.html b/html/changelog.html index 1442691167..33ff04b891 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,53 @@ -->
+

19 July 2020

+

Arturlang updated:

+
    +
  • TGUI 3.0 and enables all the UIs, plus the smart asset cache, and all the things required for them
  • +
+

EmeraldSundisk updated:

+
    +
  • Adds a pool to Delta Station
  • +
  • Adds light fixtures to specified areas
  • +
  • Relocates objects in impacted areas of Delta's starboard maintenance
  • +
+

MrJWhit updated:

+
    +
  • Adds a small light next to the kitchen counter
  • +
+

Putnam3145 updated:

+
    +
  • Pen uplinks no longer broken
  • +
+

TheObserver-sys updated:

+
    +
  • Adds a new reaction: Slime Extractification. Take 30u Slime Jelly, 5u Frost Oil, and 5u plasma to generate a fresh grey slime extract.
  • +
+

Yakumo Chen updated:

+
    +
  • Hierophant club now checks for friendly fire by default.
  • +
+

b1tt3r1n0 updated:

+
    +
  • Added the updated circle game
  • +
+

silicons updated:

+
    +
  • Unarmed parry is now a thing.
  • +
+

timothyteakettle updated:

+
    +
  • plushies in the loadout have been replaced with a box that lets you choose one instead
  • +
  • wrestling should no longer have the ability to permanently rotate people
  • +
  • you can now select to wear a snail shell as your backpack in the customization menu
  • +
+

zeroisthebiggay updated:

+
    +
  • martial arts twenty minpop
  • +
  • records
  • +
+

17 July 2020

ShizCalev, Fikou updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 05e4c0cf69..7f5d343069 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -26387,3 +26387,33 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: fixes a small pickle related issue - rscadd: recent culinary and scientific advancements have brought forth new pickle related technologies +2020-07-19: + Arturlang: + - rscadd: TGUI 3.0 and enables all the UIs, plus the smart asset cache, and all + the things required for them + EmeraldSundisk: + - rscadd: Adds a pool to Delta Station + - rscadd: Adds light fixtures to specified areas + - tweak: Relocates objects in impacted areas of Delta's starboard maintenance + MrJWhit: + - rscadd: Adds a small light next to the kitchen counter + Putnam3145: + - bugfix: Pen uplinks no longer broken + TheObserver-sys: + - rscadd: 'Adds a new reaction: Slime Extractification. Take 30u Slime Jelly, 5u + Frost Oil, and 5u plasma to generate a fresh grey slime extract.' + Yakumo Chen: + - tweak: Hierophant club now checks for friendly fire by default. + b1tt3r1n0: + - rscadd: Added the updated circle game + silicons: + - rscadd: Unarmed parry is now a thing. + timothyteakettle: + - rscadd: plushies in the loadout have been replaced with a box that lets you choose + one instead + - bugfix: wrestling should no longer have the ability to permanently rotate people + - rscadd: you can now select to wear a snail shell as your backpack in the customization + menu + zeroisthebiggay: + - tweak: martial arts twenty minpop + - bugfix: records diff --git a/html/changelogs/AutoChangeLog-pr-12229.yml b/html/changelogs/AutoChangeLog-pr-12229.yml deleted file mode 100644 index 02316f0323..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12229.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arturlang" -delete-after: True -changes: - - rscadd: "TGUI 3.0 and enables all the UIs, plus the smart asset cache, and all the things required for them" diff --git a/html/changelogs/AutoChangeLog-pr-12679.yml b/html/changelogs/AutoChangeLog-pr-12679.yml deleted file mode 100644 index 5cb7906927..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12679.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "silicons" -delete-after: True -changes: - - rscadd: "Unarmed parry is now a thing." diff --git a/html/changelogs/AutoChangeLog-pr-12733.yml b/html/changelogs/AutoChangeLog-pr-12733.yml deleted file mode 100644 index 79c6035e5e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12733.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TheObserver-sys" -delete-after: True -changes: - - rscadd: "Adds a new reaction: Slime Extractification. Take 30u Slime Jelly, 5u Frost Oil, and 5u plasma to generate a fresh grey slime extract." diff --git a/html/changelogs/AutoChangeLog-pr-12750.yml b/html/changelogs/AutoChangeLog-pr-12750.yml deleted file mode 100644 index 722b3c5c93..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12750.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "timothyteakettle" -delete-after: True -changes: - - rscadd: "plushies in the loadout have been replaced with a box that lets you choose one instead" diff --git a/html/changelogs/AutoChangeLog-pr-12758.yml b/html/changelogs/AutoChangeLog-pr-12758.yml deleted file mode 100644 index 5fb00341ea..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12758.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MrJWhit" -delete-after: True -changes: - - rscadd: "Adds a small light next to the kitchen counter" diff --git a/html/changelogs/AutoChangeLog-pr-12759.yml b/html/changelogs/AutoChangeLog-pr-12759.yml deleted file mode 100644 index bef328da68..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12759.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Yakumo Chen" -delete-after: True -changes: - - tweak: "Hierophant club now checks for friendly fire by default." diff --git a/html/changelogs/AutoChangeLog-pr-12761.yml b/html/changelogs/AutoChangeLog-pr-12761.yml deleted file mode 100644 index f3db58516e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12761.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "EmeraldSundisk" -delete-after: True -changes: - - rscadd: "Adds a pool to Delta Station" - - rscadd: "Adds light fixtures to specified areas" - - tweak: "Relocates objects in impacted areas of Delta's starboard maintenance" diff --git a/html/changelogs/AutoChangeLog-pr-12762.yml b/html/changelogs/AutoChangeLog-pr-12762.yml deleted file mode 100644 index 12432db3b2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12762.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "zeroisthebiggay" -delete-after: True -changes: - - tweak: "martial arts twenty minpop" diff --git a/html/changelogs/AutoChangeLog-pr-12763.yml b/html/changelogs/AutoChangeLog-pr-12763.yml deleted file mode 100644 index 613323cd64..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12763.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "zeroisthebiggay" -delete-after: True -changes: - - bugfix: "records" diff --git a/html/changelogs/AutoChangeLog-pr-12775.yml b/html/changelogs/AutoChangeLog-pr-12775.yml deleted file mode 100644 index e7e28914a4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12775.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "timothyteakettle" -delete-after: True -changes: - - bugfix: "wrestling should no longer have the ability to permanently rotate people" diff --git a/html/changelogs/AutoChangeLog-pr-12776.yml b/html/changelogs/AutoChangeLog-pr-12776.yml deleted file mode 100644 index d51b334a67..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12776.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "timothyteakettle" -delete-after: True -changes: - - rscadd: "you can now select to wear a snail shell as your backpack in the customization menu" diff --git a/html/changelogs/AutoChangeLog-pr-12779.yml b/html/changelogs/AutoChangeLog-pr-12779.yml deleted file mode 100644 index 49c4c20ed1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12779.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "b1tt3r1n0" -delete-after: True -changes: - - rscadd: "Added the updated circle game" diff --git a/html/changelogs/AutoChangeLog-pr-12812.yml b/html/changelogs/AutoChangeLog-pr-12812.yml deleted file mode 100644 index 7504025e37..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12812.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - bugfix: "Pen uplinks no longer broken" From 53dd4fc85780ba8435864b5f323b9db8e782f3af Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 18 Jul 2020 20:50:28 -0700 Subject: [PATCH 061/122] Update areas.dm --- code/game/area/areas.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index dabbe93bec..f87f7a757c 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -516,7 +516,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) used_environ += amount -/area/Entered(atom/movable/M) +/area/Entered(atom/movable/M, atom/OldLoc) set waitfor = FALSE SEND_SIGNAL(src, COMSIG_AREA_ENTERED, M) SEND_SIGNAL(M, COMSIG_ENTER_AREA, src) //The atom that enters the area @@ -524,6 +524,11 @@ GLOBAL_LIST_EMPTY(teleportlocs) return var/mob/living/L = M + var/turf/oldTurf = get_turf(OldLoc) + var/area/A = oldTurf?.loc + if(A && (A.has_gravity != has_gravity)) + L.update_gravity(L.mob_has_gravity()) + if(!L.ckey) return From 9b1aa3949700fda6c4d1eed6232f868306f5caf8 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 18 Jul 2020 20:51:30 -0700 Subject: [PATCH 062/122] Update space.dm --- code/game/turfs/space/space.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index b131a1ed70..42096866c4 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -133,10 +133,15 @@ else to_chat(user, "The plating is going to need some support! Place metal rods first.") -/turf/open/space/Entered(atom/movable/A) +/turf/open/space/Entered(atom/movable/A, atom/OldLoc) ..() if ((!(A) || src != A.loc)) return + + var/turf/old = get_turf(OldLoc) + if(!isspaceturf(old) && ismob(A)) + var/mob/M = A + M.update_gravity(M.mob_has_gravity()) if(destination_z && destination_x && destination_y && !(A.pulledby || !A.can_be_z_moved)) var/tx = destination_x From 5b408d5b33c0f039f43abf3f7962b48cfe0d918f Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 18 Jul 2020 20:52:15 -0700 Subject: [PATCH 063/122] Update space.dm --- code/game/turfs/space/space.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 42096866c4..0e028ed4af 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -134,9 +134,7 @@ to_chat(user, "The plating is going to need some support! Place metal rods first.") /turf/open/space/Entered(atom/movable/A, atom/OldLoc) - ..() - if ((!(A) || src != A.loc)) - return + . = ..() var/turf/old = get_turf(OldLoc) if(!isspaceturf(old) && ismob(A)) @@ -175,6 +173,12 @@ stoplag()//Let a diagonal move finish, if necessary A.newtonian_move(A.inertia_dir) +/turf/open/space/Exited(atom/movable/AM, atom/OldLoc) + . = ..() + var/turf/old = get_turf(OldLoc) + if(!isspaceturf(old) && ismob(AM)) + var/mob/M = AM + M.update_gravity(M.mob_has_gravity()) /turf/open/space/MakeSlippery(wet_setting, min_wet_time, wet_time_to_add, max_wet_time, permanent) return From 6075af8eb0b7937fecc1247369d1551b5c77b905 Mon Sep 17 00:00:00 2001 From: kappa-sama <44128284+kappa-sama@users.noreply.github.com> Date: Sun, 19 Jul 2020 04:28:44 -0400 Subject: [PATCH 064/122] nerfies --- code/modules/uplink/uplink_items/uplink_devices.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/uplink/uplink_items/uplink_devices.dm b/code/modules/uplink/uplink_items/uplink_devices.dm index df6373b8de..8ef10fbeb6 100644 --- a/code/modules/uplink/uplink_items/uplink_devices.dm +++ b/code/modules/uplink/uplink_items/uplink_devices.dm @@ -240,7 +240,8 @@ desc = "A disk containing the procedure to perform a brainwashing surgery, allowing you to implant an objective onto a target. \ Insert into an Operating Console to enable the procedure." item = /obj/item/disk/surgery/brainwashing - cost = 3 + restricted_roles = list("Medical Doctor", "Roboticist") + cost = 5 /datum/uplink_item/device_tools/encryptionkey name = "Syndicate Encryption Key" From 38f05bf23061829bc2d7a01f7fa18afc0cf2395c Mon Sep 17 00:00:00 2001 From: kappa-sama <44128284+kappa-sama@users.noreply.github.com> Date: Sun, 19 Jul 2020 04:37:51 -0400 Subject: [PATCH 065/122] 6 because i feel like it --- code/modules/uplink/uplink_items/uplink_devices.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/uplink/uplink_items/uplink_devices.dm b/code/modules/uplink/uplink_items/uplink_devices.dm index 5d19a3959c..aa4048f13b 100644 --- a/code/modules/uplink/uplink_items/uplink_devices.dm +++ b/code/modules/uplink/uplink_items/uplink_devices.dm @@ -232,7 +232,7 @@ name = "Advanced Syndicate Surgery Duffel Bag" desc = "A Syndicate surgery duffel bag, with a set of upgraded surgery tools to boot." item = /obj/item/storage/backpack/duffelbag/syndie/surgery_adv - cost = 7 + cost = 6 /datum/uplink_item/device_tools/brainwash_disk name = "Brainwashing Surgery Program" From 7094649881c7c6af679555d64e198d894b54628d Mon Sep 17 00:00:00 2001 From: Kraseo Date: Sun, 19 Jul 2020 11:30:55 +0200 Subject: [PATCH 066/122] don't like this --- .../reagents/reagent_containers/rags.dm | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/code/modules/reagents/reagent_containers/rags.dm b/code/modules/reagents/reagent_containers/rags.dm index c6903ff7b4..afa188e9f6 100644 --- a/code/modules/reagents/reagent_containers/rags.dm +++ b/code/modules/reagents/reagent_containers/rags.dm @@ -36,15 +36,19 @@ var/reagentlist = pretty_string_from_reagent_list(reagents) var/log_object = "a damp rag containing [reagentlist]" if(user.a_intent == INTENT_HARM && !C.is_mouth_covered()) - reagents.reaction(C, INGEST) - reagents.trans_to(C, 5) - C.visible_message("[user] has smothered \the [C] with \the [src]!", "[user] has smothered you with \the [src]!", "You hear some struggling and muffled cries of surprise.") - log_combat(user, C, "smothered", log_object) + C.visible_message("[user] is trying to smother \the [C] with \the [src]!", "[user] is trying to smother you with \the [src]!", "You hear some struggling and muffled cries of surprise.") + if(do_after(user, 20, target = C)) + reagents.reaction(C, INGEST) + reagents.trans_to(C, 5) + C.visible_message("[user] has smothered \the [C] with \the [src]!", "[user] has smothered you with \the [src]!", "You hear some struggling and a heavy breath taken.") + log_combat(user, C, "smothered", log_object) else - reagents.reaction(C, TOUCH) - reagents.remove_all(5) - C.visible_message("[user] has touched \the [C] with \the [src].") - log_combat(user, C, "touched", log_object) + C.visible_message("[user] is trying to wipe \the [C] with \the [src].") + if(do_after(user, 20, target = C)) + reagents.reaction(C, TOUCH) + reagents.remove_all(5) + C.visible_message("[user] has wiped \the [C] with \the [src].") + log_combat(user, C, "touched", log_object) else if(istype(A) && (src in user)) user.visible_message("[user] starts to wipe down [A] with [src]!", "You start to wipe down [A] with [src]...") From ca6b289da63894ae6acb96d98a799005bacd63ec Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 19 Jul 2020 17:49:22 +0100 Subject: [PATCH 067/122] fix tables and some minor thing --- code/game/objects/structures/tables_racks.dm | 40 ++++++++++++++++++-- code/modules/mob/living/living_defense.dm | 2 +- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 9e7c3476dc..1a9064f556 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -60,7 +60,7 @@ /obj/structure/table/attack_paw(mob/user) return attack_hand(user) -/obj/structure/table/attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags) +/obj/structure/table/attack_hand(mob/living/user) if(Adjacent(user) && user.pulling) if(isliving(user.pulling)) var/mob/living/pushed_mob = user.pulling @@ -71,7 +71,10 @@ if(user.grab_state < GRAB_AGGRESSIVE) to_chat(user, "You need a better grip to do that!") return - tablelimbsmash(user, pushed_mob) + if(user.grab_state >= GRAB_NECK) + tablelimbsmash(user, pushed_mob) + else + tablepush(user, pushed_mob) if(user.a_intent == INTENT_HELP) pushed_mob.visible_message("[user] begins to place [pushed_mob] onto [src]...", \ "[user] begins to place [pushed_mob] onto [src]...") @@ -114,10 +117,31 @@ "[user] places [pushed_mob] onto [src].") log_combat(user, pushed_mob, "placed") -/obj/structure/table/proc/tablelimbsmash(mob/living/user, mob/living/pushed_mob) - if(HAS_TRAIT(user, TRAIT_PACIFISM)) //this shouldnt even be possible anyway because you cant get them in an aggressive grab, but whatever +/obj/structure/table/proc/tablepush(mob/living/user, mob/living/pushed_mob) + if(HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, "Throwing [pushed_mob] onto the table might hurt them!") return + var/added_passtable = FALSE + if(!pushed_mob.pass_flags & PASSTABLE) + added_passtable = TRUE + pushed_mob.pass_flags |= PASSTABLE + pushed_mob.Move(src.loc) + if(added_passtable) + pushed_mob.pass_flags &= ~PASSTABLE + if(pushed_mob.loc != loc) //Something prevented the tabling + return + pushed_mob.Knockdown(30) + pushed_mob.apply_damage(10, BRUTE) + pushed_mob.apply_damage(40, STAMINA) + if(user.mind?.martial_art.smashes_tables && user.mind?.martial_art.can_use(user)) + deconstruct(FALSE) + playsound(pushed_mob, 'sound/effects/tableslam.ogg', 90, TRUE) + pushed_mob.visible_message("[user] slams [pushed_mob] onto \the [src]!", \ + "[user] slams you onto \the [src]!") + log_combat(user, pushed_mob, "tabled", null, "onto [src]") + SEND_SIGNAL(pushed_mob, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table) + +/obj/structure/table/proc/tablelimbsmash(mob/living/user, mob/living/pushed_mob) pushed_mob.Knockdown(30) var/obj/item/bodypart/banged_limb = pushed_mob.get_bodypart(user.zone_selected) || pushed_mob.get_bodypart(BODY_ZONE_HEAD) var/extra_wound = 0 @@ -125,6 +149,14 @@ extra_wound = 20 banged_limb.receive_damage(30, wound_bonus = extra_wound) pushed_mob.apply_damage(60, STAMINA) + take_damage(50) + if(user.mind?.martial_art.smashes_tables && user.mind?.martial_art.can_use(user)) + deconstruct(FALSE) + playsound(pushed_mob, 'sound/effects/bang.ogg', 90, TRUE) + pushed_mob.visible_message("[user] smashes [pushed_mob]'s [banged_limb.name] against \the [src]!", + "[user] smashes your [banged_limb.name] against \the [src]") + log_combat(user, pushed_mob, "head slammed", null, "against [src]") + SEND_SIGNAL(pushed_mob, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table_limbsmash, banged_limb) /obj/structure/table/shove_act(mob/living/target, mob/living/user) if(CHECK_MOBILITY(target, MOBILITY_STAND)) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 88de7477ea..e24e9641bf 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -85,7 +85,7 @@ totaldamage = block_calculate_resultant_damage(totaldamage, returnlist) var/armor = run_armor_check(def_zone, P.flag, null, null, P.armour_penetration, null) if(!P.nodamage) - apply_damage(P.damage, P.damage_type, def_zone, armor, wound_bonus=P.wound_bonus, bare_wound_bonus=P.bare_wound_bonus, sharpness=P.sharpness) + apply_damage(totaldamage, P.damage_type, def_zone, armor, wound_bonus=P.wound_bonus, bare_wound_bonus=P.bare_wound_bonus, sharpness=P.sharpness) if(P.dismemberment) check_projectile_dismemberment(P, def_zone) var/missing = 100 - final_percent From a8d2f558bcbb72a66017f47b198fed1d2eac5904 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 19 Jul 2020 17:53:25 +0100 Subject: [PATCH 068/122] use old table pushing --- code/game/objects/structures/tables_racks.dm | 21 ++++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 1a9064f556..1b7eb25bb8 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -130,16 +130,16 @@ pushed_mob.pass_flags &= ~PASSTABLE if(pushed_mob.loc != loc) //Something prevented the tabling return - pushed_mob.Knockdown(30) - pushed_mob.apply_damage(10, BRUTE) - pushed_mob.apply_damage(40, STAMINA) - if(user.mind?.martial_art.smashes_tables && user.mind?.martial_art.can_use(user)) - deconstruct(FALSE) - playsound(pushed_mob, 'sound/effects/tableslam.ogg', 90, TRUE) - pushed_mob.visible_message("[user] slams [pushed_mob] onto \the [src]!", \ - "[user] slams you onto \the [src]!") + pushed_mob.DefaultCombatKnockdown(40) + pushed_mob.visible_message("[user] slams [pushed_mob] onto [src]!", \ + "[user] slams you onto [src]!") log_combat(user, pushed_mob, "tabled", null, "onto [src]") - SEND_SIGNAL(pushed_mob, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table) + if(!ishuman(pushed_mob)) + return + var/mob/living/carbon/human/H = pushed_mob + if(iscatperson(H)) + H.emote("nya") + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table) /obj/structure/table/proc/tablelimbsmash(mob/living/user, mob/living/pushed_mob) pushed_mob.Knockdown(30) @@ -150,8 +150,7 @@ banged_limb.receive_damage(30, wound_bonus = extra_wound) pushed_mob.apply_damage(60, STAMINA) take_damage(50) - if(user.mind?.martial_art.smashes_tables && user.mind?.martial_art.can_use(user)) - deconstruct(FALSE) + playsound(pushed_mob, 'sound/effects/bang.ogg', 90, TRUE) pushed_mob.visible_message("[user] smashes [pushed_mob]'s [banged_limb.name] against \the [src]!", "[user] smashes your [banged_limb.name] against \the [src]") From fdfee756b7746792634265bc621f67e8e7b95f06 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 19 Jul 2020 18:18:22 +0100 Subject: [PATCH 069/122] you can enter stamcrit now --- code/modules/surgery/bodyparts/parts.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index fde858b7a5..2a72adeb5f 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -9,7 +9,7 @@ px_x = 0 px_y = 0 stam_damage_coeff = 1 - max_stamina_damage = 120 + max_stamina_damage = 200 var/obj/item/cavity_item specific_locations = list("upper chest", "lower abdomen", "midsection", "collarbone", "lower back") wound_resistance = 10 From 1b99cb92017fc1f0daa6c204d0bb3d7b2ba51b35 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 19 Jul 2020 18:32:44 +0100 Subject: [PATCH 070/122] everything has the bonesetter --- code/game/objects/items/storage/backpack.dm | 1 + code/modules/cargo/exports/organs_robotics.dm | 2 +- code/modules/mob/living/silicon/robot/robot_modules.dm | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 41561c0d51..23e8d4eaf1 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -504,6 +504,7 @@ new /obj/item/scalpel/advanced(src) new /obj/item/retractor/advanced(src) new /obj/item/surgicaldrill/advanced(src) + new /obj/item/bonesetter(src) new /obj/item/surgical_drapes(src) new /obj/item/storage/firstaid/tactical(src) new /obj/item/clothing/suit/straight_jacket(src) diff --git a/code/modules/cargo/exports/organs_robotics.dm b/code/modules/cargo/exports/organs_robotics.dm index a6c5ee93ca..7f54e675ca 100644 --- a/code/modules/cargo/exports/organs_robotics.dm +++ b/code/modules/cargo/exports/organs_robotics.dm @@ -144,7 +144,7 @@ /datum/export/robotics/surgery_gear_basic cost = 10 unit_name = "surgery tool" - export_types = list(/obj/item/retractor, /obj/item/hemostat, /obj/item/cautery, /obj/item/surgicaldrill, /obj/item/scalpel, /obj/item/circular_saw, /obj/item/surgical_drapes) + export_types = list(/obj/item/retractor, /obj/item/hemostat, /obj/item/cautery, /obj/item/surgicaldrill, /obj/item/scalpel, /obj/item/circular_saw, /obj/item/bonesetter, /obj/item/surgical_drapes) /datum/export/robotics/mech_weapon_laser cost = 300 //Sadly just metal and glass diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index fa4dbd820e..a2601aadfa 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -1053,6 +1053,8 @@ /obj/item/cautery, /obj/item/surgicaldrill, /obj/item/scalpel, + /obj/item/bonesetter, + /obj/item/stack/medical/bone_gel, /obj/item/melee/transforming/energy/sword/cyborg/saw, /obj/item/roller/robo, /obj/item/card/emag, From 26a240ddb9d0469d2b762668f85c63fca9950f44 Mon Sep 17 00:00:00 2001 From: kappa-sama <44128284+kappa-sama@users.noreply.github.com> Date: Sun, 19 Jul 2020 15:14:12 -0400 Subject: [PATCH 071/122] bye --- code/modules/uplink/uplink_items/uplink_devices.dm | 8 -------- 1 file changed, 8 deletions(-) diff --git a/code/modules/uplink/uplink_items/uplink_devices.dm b/code/modules/uplink/uplink_items/uplink_devices.dm index 8ef10fbeb6..a0dff3bb6b 100644 --- a/code/modules/uplink/uplink_items/uplink_devices.dm +++ b/code/modules/uplink/uplink_items/uplink_devices.dm @@ -235,14 +235,6 @@ item = /obj/item/storage/backpack/duffelbag/syndie/surgery_adv cost = 10 -/datum/uplink_item/device_tools/brainwash_disk - name = "Brainwashing Surgery Program" - desc = "A disk containing the procedure to perform a brainwashing surgery, allowing you to implant an objective onto a target. \ - Insert into an Operating Console to enable the procedure." - item = /obj/item/disk/surgery/brainwashing - restricted_roles = list("Medical Doctor", "Roboticist") - cost = 5 - /datum/uplink_item/device_tools/encryptionkey name = "Syndicate Encryption Key" desc = "A key that, when inserted into a radio headset, allows you to listen to all station department channels \ From ba15c17e028166271aca0b454204ea1c4abaa4fd Mon Sep 17 00:00:00 2001 From: kappa-sama <44128284+kappa-sama@users.noreply.github.com> Date: Sun, 19 Jul 2020 15:14:44 -0400 Subject: [PATCH 072/122] here --- code/modules/uplink/uplink_items/uplink_roles.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/modules/uplink/uplink_items/uplink_roles.dm b/code/modules/uplink/uplink_items/uplink_roles.dm index da25cf5298..859c8c0bd7 100644 --- a/code/modules/uplink/uplink_items/uplink_roles.dm +++ b/code/modules/uplink/uplink_items/uplink_roles.dm @@ -39,6 +39,14 @@ cost = 12 restricted_roles = list("Research Director", "Scientist", "Roboticist") +/datum/uplink_item/device_tools/brainwash_disk + name = "Brainwashing Surgery Program" + desc = "A disk containing the procedure to perform a brainwashing surgery, allowing you to implant an objective onto a target. \ + Insert into an Operating Console to enable the procedure." + item = /obj/item/disk/surgery/brainwashing + restricted_roles = list("Medical Doctor", "Roboticist") + cost = 5 + /datum/uplink_item/role_restricted/clown_bomb name = "Clown Bomb" desc = "The Clown bomb is a hilarious device capable of massive pranks. It has an adjustable timer, \ From 037cec508eea1e8b97f52df61ac9600f33b6a350 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 19 Jul 2020 21:43:17 +0100 Subject: [PATCH 073/122] fixes a math mistake --- code/datums/wounds/bones.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm index 93ca9c5b67..230fc6758f 100644 --- a/code/datums/wounds/bones.dm +++ b/code/datums/wounds/bones.dm @@ -390,7 +390,7 @@ if(victim.reagents && victim.reagents.has_reagent(/datum/reagent/determination)) painkiller_bonus += 5 - if(prob(25 + (20 * severity - 2) - painkiller_bonus)) // 25%/45% chance to fail self-applying with severe and critical wounds, modded by painkillers + if(prob(25 + (20 * (severity - 2)) - painkiller_bonus)) // 25%/45% chance to fail self-applying with severe and critical wounds, modded by painkillers victim.visible_message("[victim] fails to finish applying [I] to [victim.p_their()] [limb.name], passing out from the pain!", "You black out from the pain of applying [I] to your [limb.name] before you can finish!") victim.AdjustUnconscious(5 SECONDS) return From 8709a72fc01c3f9e1965619f76472667572adb1c Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 20 Jul 2020 00:40:18 +0100 Subject: [PATCH 074/122] fry everything --- code/__DEFINES/is_helpers.dm | 2 +- code/__HELPERS/unsorted.dm | 1 - code/datums/components/edible.dm | 3 +- code/datums/components/fried.dm | 89 +++++++++++++++++++ code/modules/food_and_drinks/food/snacks.dm | 7 +- .../food_and_drinks/food/snacks_bread.dm | 87 ------------------ .../kitchen_machinery/deep_fryer.dm | 12 +-- .../chemistry/reagents/food_reagents.dm | 8 +- .../chemistry/recipes/slime_extracts.dm | 5 +- tgstation.dme | 1 + 10 files changed, 107 insertions(+), 108 deletions(-) create mode 100644 code/datums/components/fried.dm diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 90c7c34f8d..a9d9bda00c 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -216,7 +216,7 @@ GLOBAL_LIST_INIT(pointed_types, typecacheof(list( #define isgun(A) (istype(A, /obj/item/gun)) -#define isfood(A) (istype(A, /obj/item/reagent_containers/food)) +#define isfood(A) (istype(A, /obj/item/reagent_containers/food/snacks)) //Assemblies #define isassembly(O) (istype(O, /obj/item/assembly)) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index cbe004ed90..4addae3ac4 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1437,7 +1437,6 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) /obj/item/reagent_containers/food/snacks/grown, /obj/item/reagent_containers/food/snacks/grown/mushroom, /obj/item/reagent_containers/food/snacks/grown/nettle, // base type - /obj/item/reagent_containers/food/snacks/deepfryholder, /obj/item/reagent_containers/food/snacks/grown/shell, /obj/item/reagent_containers/food/snacks/clothing, /obj/item/reagent_containers/food/snacks/store/bread diff --git a/code/datums/components/edible.dm b/code/datums/components/edible.dm index 47e60a1ee1..dc2e490fe4 100644 --- a/code/datums/components/edible.dm +++ b/code/datums/components/edible.dm @@ -51,7 +51,8 @@ Behavior that's still missing from this component that original food items had t var/atom/owner = parent - owner.create_reagents(volume, INJECTABLE) + if(!owner.reagents) //we don't want to override what's in the item if it possibly contains reagents already + owner.create_reagents(volume, INJECTABLE) if(initial_reagents) for(var/rid in initial_reagents) diff --git a/code/datums/components/fried.dm b/code/datums/components/fried.dm new file mode 100644 index 0000000000..3e4b78a1a6 --- /dev/null +++ b/code/datums/components/fried.dm @@ -0,0 +1,89 @@ +/*! + This component essentially encapsulates frying and utilizes the edible component + This means fried items can work like regular ones, and generally the code is far less messy +*/ +/datum/component/fried + var/fry_power //how powerfully was this item fried + var/atom/owner //the atom it is owned by + var/stored_name //name of the owner when the component was first added + var/frying_examine_text = "the coders messed frying code up, report this!" + +/datum/component/fried/Initialize(frying_power) + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) + + fry_power = frying_power + owner = parent + stored_name = owner.name + + setup_fried_item() + +//some stuff to do with the contents of fried junk +GLOBAL_VAR_INIT(frying_hardmode, TRUE) +GLOBAL_VAR_INIT(frying_bad_chem_add_volume, TRUE) +GLOBAL_LIST_INIT(frying_bad_chems, list( +/datum/reagent/toxin/bad_food = 1, +/datum/reagent/toxin = 1, +/datum/reagent/lithium = 1, +/datum/reagent/mercury = 1, +)) + +/datum/component/fried/proc/examine(datum/source, mob/user, list/examine_list) + examine_list += "The [parent] has been [frying_examine_text]" + +/datum/component/fried/proc/setup_fried_item() //sets the name, colour and examine text and edibility up + switch(fry_power) + if(0 to 15) + owner.name = "lightly fried [owner.name]" + owner.add_atom_colour(rgb(166,103,54), FIXED_COLOUR_PRIORITY) + frying_examine_text = "lightly fried" + if(16 to 49) + owner.name = "fried [owner.name]" + owner.add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY) + frying_examine_text = "moderately fried" + if(50 to 59) + owner.name = "deep fried [owner.name]" + owner.add_atom_colour(rgb(63,23,4), FIXED_COLOUR_PRIORITY) + frying_examine_text = "deeply fried" + else + owner.name = "the physical manifestation of fried foods" + owner.add_atom_colour(rgb(33,19,9), FIXED_COLOUR_PRIORITY) + frying_examine_text = "incomprehensibly fried to a crisp" + + var/list/fried_tastes = list("crispy") + var/fried_foodtypes = FRIED + var/fried_junk = FALSE + + if(!isfood(owner) && GLOB.frying_hardmode && GLOB.frying_bad_chems.len && !owner.reagents) //you fried some junk, it's not gonna taste great + fried_junk = TRUE + fried_foodtypes |= TOXIC // junk tastes toxic too + else + if(isfood(owner)) + var/obj/item/reagent_containers/food/snacks/food_item = owner + fried_tastes += food_item.tastes + fried_foodtypes |= food_item.foodtype + + owner.AddComponent(/datum/component/edible, foodtypes = fried_tastes, tastes = fried_tastes) + + //adding the edible component gives it reagents meaning we can now add the bad frying reagents if it's junk + if(fried_junk && owner.reagents) //check again just incase + var/R = rand(1, GLOB.frying_bad_chems.len) + var/bad_chem = GLOB.frying_bad_chems[R] + var/bad_chem_amount = max(4,GLOB.frying_bad_chems[bad_chem] * (fry_power/12.5)) //4u of bad chem reached when deeply fried + owner.reagents.add_reagent(bad_chem, bad_chem_amount) + +/datum/component/fried/proc/restore_name() //restore somethings name + //we do string manipulation and not restoring their name to real_name because some things hide your real_name and we want to maintain that + if(copytext(owner.name,1,14) == "lightly fried ") + owner.name = copytext(owner.name,15) + else + if(copytext(owner.name,1,6) == "fried ") + owner.name = copytext(owner.name,7) + else + if(copytext(owner.name,1,11) == "deep fried ") + owner.name = copytext(owner.name, 12) + else + if(owner.name == "the physical manifestation of fried foods") //if the name is still this, their name hasn't changed, so we can safely restore their stored name + owner.name = stored_name diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index de264ff0e4..7c2cba0c95 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -21,7 +21,7 @@ Food formatting and crafting examples. icon_state = "saltychip" //Refers to an icon, usually in food.dmi bitesize = 3 //How many reagents are consumed in each bite. list_reagents = list(/datum/reagent/consumable/nutriment = 6, //What's inside the snack, but only if spawned. For example, from a chemical reaction, vendor, or slime core spawn. - /datum/reagent/consumable/nutriment/vitamin = 2) + /datum/reagent/consumable/nutriment/vitamin = 2) bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, //What's -added- to the food, in addition to the reagents contained inside the foods used to craft it. Basically, a reward for cooking. /datum/reagent/consumable/nutriment/vitamin = 1) ^^For example. Egg+Egg = 2Egg + Bonus Reagents. filling_color = "#F4A460" //What color it will use if put in a custom food. @@ -406,3 +406,8 @@ All foods are distributed among various categories. Use common sense. TB.MouseDrop(over) else return ..() + +// //////////////////////////////////////////////Frying//////////////////////////////////////// +/atom/proc/fry(cook_time = 30) //you can truly fry anything + if(!GetComponent(/datum/component/fried)) + AddComponent(/datum/component/fried, frying_power = cook_time) diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm index f3d84f7169..0d7c715654 100644 --- a/code/modules/food_and_drinks/food/snacks_bread.dm +++ b/code/modules/food_and_drinks/food/snacks_bread.dm @@ -191,93 +191,6 @@ tastes = list("bread" = 1, "garlic" = 1, "butter" = 1) foodtype = GRAIN -/obj/item/reagent_containers/food/snacks/deepfryholder - name = "Deep Fried Foods Holder Obj" - desc = "If you can see this description the code for the deep fryer fucked up." - icon = 'icons/obj/food/food.dmi' - icon_state = "" - bitesize = 2 - var/fried_garbage = FALSE //did you really fry a fire extinguisher? - -GLOBAL_VAR_INIT(frying_hardmode, TRUE) -GLOBAL_VAR_INIT(frying_bad_chem_add_volume, TRUE) -GLOBAL_LIST_INIT(frying_bad_chems, list( -/datum/reagent/toxin/bad_food = 3, -/datum/reagent/drug/aranesp = 2, -/datum/reagent/toxin = 2, -/datum/reagent/lithium = 2, -/datum/reagent/mercury = 2, -)) - -/obj/item/reagent_containers/food/snacks/deepfryholder/Initialize(mapload, obj/item/fried) - . = ..() - name = fried.name //We'll determine the other stuff when it's actually removed - appearance = fried.appearance - layer = initial(layer) - plane = initial(plane) - lefthand_file = fried.lefthand_file - righthand_file = fried.righthand_file - item_state = fried.item_state - desc = fried.desc - w_class = fried.w_class - slowdown = fried.slowdown - equip_delay_self = fried.equip_delay_self - equip_delay_other = fried.equip_delay_other - strip_delay = fried.strip_delay - species_exception = fried.species_exception - item_flags = fried.item_flags - obj_flags = fried.obj_flags - - if(isfood(fried)) - fried.reagents.trans_to(src, fried.reagents.total_volume) - qdel(fried) - else - fried.forceMove(src) - trash = fried - fried_garbage = TRUE - -/obj/item/reagent_containers/food/snacks/deepfryholder/Destroy() - if(trash) - QDEL_NULL(trash) - . = ..() - -/obj/item/reagent_containers/food/snacks/deepfryholder/On_Consume(mob/living/eater) - if(fried_garbage && GLOB.frying_hardmode && GLOB.frying_bad_chems.len) - var/R = rand(1, GLOB.frying_bad_chems.len) - var/bad_chem = GLOB.frying_bad_chems[R] - var/bad_chem_amount = GLOB.frying_bad_chems[bad_chem] - eater.reagents.add_reagent(bad_chem, bad_chem_amount) - //All fried inedible items also get condensed cooking oil added, which induces minor vomiting and heart damage - eater.reagents.add_reagent(/datum/reagent/toxin/condensed_cooking_oil, 2) - if(trash) - QDEL_NULL(trash) - ..() - -/obj/item/reagent_containers/food/snacks/deepfryholder/proc/fry(cook_time = 30) - switch(cook_time) - if(0 to 15) - add_atom_colour(rgb(166,103,54), FIXED_COLOUR_PRIORITY) - name = "lightly-fried [name]" - desc = "[desc] It's been lightly fried in a deep fryer." - adjust_food_quality(food_quality - 5) - if(16 to 49) - add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY) - name = "fried [name]" - desc = "[desc] It's been fried, increasing its tastiness value by [rand(1, 75)]%." - adjust_food_quality(food_quality - 10) - if(50 to 59) - add_atom_colour(rgb(63,23,4), FIXED_COLOUR_PRIORITY) - name = "deep-fried [name]" - desc = "[desc] Deep-fried to perfection." - adjust_food_quality(food_quality) //we shouldn't punish perfection in the fried arts - if(60 to INFINITY) - add_atom_colour(rgb(33,19,9), FIXED_COLOUR_PRIORITY) - name = "the physical manifestation of the very concept of fried foods" - desc = "A heavily-fried...something. Who can tell anymore?" - adjust_food_quality(0) //good job, you're truly the best cook. - filling_color = color - foodtype |= FRIED - /obj/item/reagent_containers/food/snacks/butteredtoast name = "buttered toast" desc = "Butter lightly spread over a piece of toast." diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index d05f0b334f..5cb5a59afb 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -29,7 +29,7 @@ God bless America. use_power = IDLE_POWER_USE idle_power_usage = 5 layer = BELOW_OBJ_LAYER - var/obj/item/reagent_containers/food/snacks/deepfryholder/frying //What's being fried RIGHT NOW? + var/obj/item/frying //What's being fried RIGHT NOW? var/cook_time = 0 var/oil_use = 0.05 //How much cooking oil is used per tick var/fry_speed = 1 //How quickly we fry food @@ -91,7 +91,7 @@ God bless America. if(I.resistance_flags & INDESTRUCTIBLE) to_chat(user, "You don't feel it would be wise to fry [I]...") return - if(istype(I, /obj/item/reagent_containers/food/snacks/deepfryholder)) + if(I.GetComponent(/datum/component/fried)) to_chat(user, "Your cooking skills are not up to the legendary Doublefry technique.") return if(default_unfasten_wrench(user, I)) @@ -102,14 +102,8 @@ God bless America. if(is_type_in_typecache(I, deepfry_blacklisted_items) || HAS_TRAIT(I, TRAIT_NODROP) || (I.item_flags & (ABSTRACT | DROPDEL))) return ..() else if(!frying && user.transferItemToLoc(I, src)) + frying = I to_chat(user, "You put [I] into [src].") - frying = new/obj/item/reagent_containers/food/snacks/deepfryholder(src, I) - //setup food quality for item depending on if it's edible or not - if(isfood(I)) - var/obj/item/reagent_containers/food/original_food = I - frying.adjust_food_quality(original_food.food_quality) //food quality remains unchanged until degree of frying is calculated - else - frying.adjust_food_quality(10) //inedible fried item has low quality icon_state = "fryer_on" fry_loop.start() diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index f80cd10792..982ef85328 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -115,11 +115,11 @@ /datum/reagent/consumable/cooking_oil/reaction_obj(obj/O, reac_volume) if(holder && holder.chem_temp >= fry_temperature) - if(isitem(O) && !istype(O, /obj/item/reagent_containers/food/snacks/deepfryholder) && !(O.resistance_flags & (FIRE_PROOF|INDESTRUCTIBLE))) + if(isitem(O) && !O.GetComponent(/datum/component/fried) && !(O.resistance_flags & (FIRE_PROOF|INDESTRUCTIBLE)) && !O.reagents) //don't fry stuff we shouldn't O.loc.visible_message("[O] rapidly fries as it's splashed with hot oil! Somehow.") - var/obj/item/reagent_containers/food/snacks/deepfryholder/F = new(O.drop_location(), O) - F.fry(volume) - F.reagents.add_reagent(/datum/reagent/consumable/cooking_oil, reac_volume) + O.fry(volume) + if(O.reagents) + O.reagents.add_reagent(/datum/reagent/consumable/cooking_oil, reac_volume) /datum/reagent/consumable/cooking_oil/reaction_mob(mob/living/M, method = TOUCH, reac_volume, show_message = 1, touch_protection = 0) if(!istype(M)) diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index ead47e2a42..2c3f25e73a 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -165,10 +165,7 @@ var/chosen = getbork() var/obj/B = new chosen(T) if(prob(5))//Fry it! - var/obj/item/reagent_containers/food/snacks/deepfryholder/fried - fried = new(T, B) - fried.fry() // actually set the name and colour it - B = fried + B.fry() // actually set the name and colour it if(prob(50)) for(var/j in 1 to rand(1, 3)) step(B, pick(NORTH,SOUTH,EAST,WEST)) diff --git a/tgstation.dme b/tgstation.dme index 9314992c5f..2c5d30e2b7 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -415,6 +415,7 @@ #include "code\datums\components\explodable.dm" #include "code\datums\components\field_of_vision.dm" #include "code\datums\components\footstep.dm" +#include "code\datums\components\fried.dm" #include "code\datums\components\identification.dm" #include "code\datums\components\igniter.dm" #include "code\datums\components\infective.dm" From c052e79e855558a4e9c676f82104726ea86dbf53 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 19 Jul 2020 18:43:03 -0500 Subject: [PATCH 075/122] Automatic changelog generation for PR #12810 [ci skip] --- html/changelogs/AutoChangeLog-pr-12810.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12810.yml diff --git a/html/changelogs/AutoChangeLog-pr-12810.yml b/html/changelogs/AutoChangeLog-pr-12810.yml new file mode 100644 index 0000000000..c68ca0a0bd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12810.yml @@ -0,0 +1,5 @@ +author: "lolman360" +delete-after: True +changes: + - tweak: "Service borgs now have synthesizers instead of a violin and guitar." + - bugfix: "borg RSF" From e2b68797b7be38e3f60047b3e8cc4048b2c845e3 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 20 Jul 2020 00:49:00 +0100 Subject: [PATCH 076/122] bugfixes --- code/datums/components/fried.dm | 2 +- code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm | 2 ++ code/modules/reagents/chemistry/reagents/food_reagents.dm | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/datums/components/fried.dm b/code/datums/components/fried.dm index 3e4b78a1a6..6fec887a28 100644 --- a/code/datums/components/fried.dm +++ b/code/datums/components/fried.dm @@ -31,7 +31,7 @@ GLOBAL_LIST_INIT(frying_bad_chems, list( )) /datum/component/fried/proc/examine(datum/source, mob/user, list/examine_list) - examine_list += "The [parent] has been [frying_examine_text]" + examine_list += "[parent] has been [frying_examine_text]" /datum/component/fried/proc/setup_fried_item() //sets the name, colour and examine text and edibility up switch(fry_power) diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index 5cb5a59afb..f3c63c1ba2 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -98,6 +98,8 @@ God bless America. return else if(default_deconstruction_screwdriver(user, "fryer_off", "fryer_off" ,I)) //where's the open maint panel icon?! return + else if(I.reagents && !isfood(I)) + return else if(is_type_in_typecache(I, deepfry_blacklisted_items) || HAS_TRAIT(I, TRAIT_NODROP) || (I.item_flags & (ABSTRACT | DROPDEL))) return ..() diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 982ef85328..6acc4d5a64 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -115,7 +115,7 @@ /datum/reagent/consumable/cooking_oil/reaction_obj(obj/O, reac_volume) if(holder && holder.chem_temp >= fry_temperature) - if(isitem(O) && !O.GetComponent(/datum/component/fried) && !(O.resistance_flags & (FIRE_PROOF|INDESTRUCTIBLE)) && !O.reagents) //don't fry stuff we shouldn't + if(isitem(O) && !O.GetComponent(/datum/component/fried) && !(O.resistance_flags & (FIRE_PROOF|INDESTRUCTIBLE)) && (!O.reagents || isfood(O))) //don't fry stuff we shouldn't O.loc.visible_message("[O] rapidly fries as it's splashed with hot oil! Somehow.") O.fry(volume) if(O.reagents) From 2af449a3c7f959cd0bb97df06ad54c14cd5f6c85 Mon Sep 17 00:00:00 2001 From: Funce Date: Mon, 20 Jul 2020 11:55:23 +1200 Subject: [PATCH 077/122] Fixes genewebs being impossibly impassable --- code/game/objects/effects/spiders.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index be0faccf5b..8d50d822f7 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -38,7 +38,7 @@ /obj/structure/spider/stickyweb/CanPass(atom/movable/mover, turf/target) if (genetic) - return + return TRUE if(istype(mover, /mob/living/simple_animal/hostile/poison/giant_spider)) return TRUE else if(isliving(mover)) From 809b9d8d35a9b4322b0bcbd4785d0cc859ecde0f Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 20 Jul 2020 00:10:32 +0000 Subject: [PATCH 078/122] Automatic changelog compile [ci skip] --- html/changelog.html | 7 +++++++ html/changelogs/.all_changelog.yml | 4 ++++ html/changelogs/AutoChangeLog-pr-12810.yml | 5 ----- 3 files changed, 11 insertions(+), 5 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-12810.yml diff --git a/html/changelog.html b/html/changelog.html index 33ff04b891..28a790a46f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,13 @@ -->
    +

    20 July 2020

    +

    lolman360 updated:

    +
      +
    • Service borgs now have synthesizers instead of a violin and guitar.
    • +
    • borg RSF
    • +
    +

    19 July 2020

    Arturlang updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 7f5d343069..97a1f5fda8 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -26417,3 +26417,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. zeroisthebiggay: - tweak: martial arts twenty minpop - bugfix: records +2020-07-20: + lolman360: + - tweak: Service borgs now have synthesizers instead of a violin and guitar. + - bugfix: borg RSF diff --git a/html/changelogs/AutoChangeLog-pr-12810.yml b/html/changelogs/AutoChangeLog-pr-12810.yml deleted file mode 100644 index c68ca0a0bd..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12810.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "lolman360" -delete-after: True -changes: - - tweak: "Service borgs now have synthesizers instead of a violin and guitar." - - bugfix: "borg RSF" From 0c07faa3e0c9b388843156271fc8296774b80f64 Mon Sep 17 00:00:00 2001 From: Funce Date: Mon, 20 Jul 2020 12:22:18 +1200 Subject: [PATCH 079/122] For future reference, '.' return overrides 'return' statements --- code/game/objects/effects/spiders.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 8d50d822f7..745b281d2a 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -38,7 +38,7 @@ /obj/structure/spider/stickyweb/CanPass(atom/movable/mover, turf/target) if (genetic) - return TRUE + return if(istype(mover, /mob/living/simple_animal/hostile/poison/giant_spider)) return TRUE else if(isliving(mover)) @@ -69,6 +69,7 @@ if(prob(50)) to_chat(mover, "You get stuck in \the [src] for a moment.") return FALSE + return TRUE else if(istype(mover, /obj/item/projectile)) return prob(30) From 64d5bd003009f58e9033777e96a12d602d7fbd06 Mon Sep 17 00:00:00 2001 From: Chiirno Date: Sun, 19 Jul 2020 21:38:44 -0300 Subject: [PATCH 080/122] switches around messages --- code/game/objects/items/storage/firstaid.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 34c1a6b280..ea88f80304 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -240,9 +240,9 @@ SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, P, user) if(!user.put_in_hands(P)) P.forceMove(user.drop_location()) // make sure it's not stuck in the user if the put in hands somehow fails - to_chat(user, "You take \a [P] out of [src].") - else to_chat(user, "[P] drops to the floor!") + else + to_chat(user, "You take \a [P] out of [src].") else to_chat(user, "There are no pills left in the bottle.") return TRUE From eab0ae8af0bbb5402e4d06e8e240e672dc6a12c1 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 20 Jul 2020 17:20:54 +0100 Subject: [PATCH 081/122] small changes --- code/modules/food_and_drinks/food/snacks.dm | 7 ++++++- .../chemistry/reagents/food_reagents.dm | 5 ++--- .../chemistry/reagents/toxin_reagents.dm | 19 ------------------- 3 files changed, 8 insertions(+), 23 deletions(-) diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 7c2cba0c95..3c26ff7048 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -409,5 +409,10 @@ All foods are distributed among various categories. Use common sense. // //////////////////////////////////////////////Frying//////////////////////////////////////// /atom/proc/fry(cook_time = 30) //you can truly fry anything - if(!GetComponent(/datum/component/fried)) + //don't fry reagent containers that aren't food items, indestructable items, or items that are already fried + if(isitem(src)) + var/obj/item/fried_item = src + if(fried_item.resistance_flags & INDESTRUCTIBLE) + return + if(!GetComponent(/datum/component/fried) && (!reagents || isfood(src))) AddComponent(/datum/component/fried, frying_power = cook_time) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 6acc4d5a64..d449fa310c 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -141,10 +141,9 @@ /datum/reagent/consumable/cooking_oil/reaction_turf(turf/open/T, reac_volume) if(!istype(T) || isgroundlessturf(T)) return - if(reac_volume >= 5) + if(reac_volume >= 5 && holder && holder.chem_temp >= fry_temperature) T.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = reac_volume * 1.5 SECONDS) - T.name = "deep-fried [initial(T.name)]" - T.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) + T.fry(reac_volume/4) /datum/reagent/consumable/sugar name = "Sugar" diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 02e4a89e1d..c7add16fcf 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -520,25 +520,6 @@ taste_description = "bad cooking" value = REAGENT_VALUE_NONE -/datum/reagent/toxin/condensed_cooking_oil - name = "Condensed Cooking Oil" - description = "Taste the consequences of your mistakes." - reagent_state = LIQUID - color = "#d6d6d8" - metabolization_rate = 0.25 * REAGENTS_METABOLISM - toxpwr = 0 - taste_mult = -2 - taste_description = "awful cooking" - value = REAGENT_VALUE_NONE - -/datum/reagent/toxin/condensed_cooking_oil/on_mob_life(mob/living/carbon/M) - if(prob(5)) - M.vomit() - else - if(prob(40)) - M.adjustOrganLoss(ORGAN_SLOT_HEART, 0.5) //For reference, bungotoxin does 3 - ..() - /datum/reagent/toxin/itching_powder name = "Itching Powder" description = "A powder that induces itching upon contact with the skin. Causes the victim to scratch at their itches and has a very low chance to decay into Histamine." From c68f0559d9f72dace49edfa01652937e36eb9f9e Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 20 Jul 2020 17:29:09 +0100 Subject: [PATCH 082/122] old instant eating speed --- code/datums/components/fried.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/fried.dm b/code/datums/components/fried.dm index 6fec887a28..eb06fbde8f 100644 --- a/code/datums/components/fried.dm +++ b/code/datums/components/fried.dm @@ -65,7 +65,7 @@ GLOBAL_LIST_INIT(frying_bad_chems, list( fried_tastes += food_item.tastes fried_foodtypes |= food_item.foodtype - owner.AddComponent(/datum/component/edible, foodtypes = fried_tastes, tastes = fried_tastes) + owner.AddComponent(/datum/component/edible, foodtypes = fried_tastes, tastes = fried_tastes, eat_time = 0) //adding the edible component gives it reagents meaning we can now add the bad frying reagents if it's junk if(fried_junk && owner.reagents) //check again just incase From a0c166c4901ef9ca64e05561dc151501987bb82a Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 20 Jul 2020 17:43:58 +0100 Subject: [PATCH 083/122] badmin safeguarding --- code/datums/components/fried.dm | 54 +++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/code/datums/components/fried.dm b/code/datums/components/fried.dm index eb06fbde8f..c0ffa8cd0f 100644 --- a/code/datums/components/fried.dm +++ b/code/datums/components/fried.dm @@ -13,6 +13,7 @@ return COMPONENT_INCOMPATIBLE RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) + RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/restore) //basically, unfry people who are being cleaned (badmemes fried someone) fry_power = frying_power owner = parent @@ -34,24 +35,7 @@ GLOBAL_LIST_INIT(frying_bad_chems, list( examine_list += "[parent] has been [frying_examine_text]" /datum/component/fried/proc/setup_fried_item() //sets the name, colour and examine text and edibility up - switch(fry_power) - if(0 to 15) - owner.name = "lightly fried [owner.name]" - owner.add_atom_colour(rgb(166,103,54), FIXED_COLOUR_PRIORITY) - frying_examine_text = "lightly fried" - if(16 to 49) - owner.name = "fried [owner.name]" - owner.add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY) - frying_examine_text = "moderately fried" - if(50 to 59) - owner.name = "deep fried [owner.name]" - owner.add_atom_colour(rgb(63,23,4), FIXED_COLOUR_PRIORITY) - frying_examine_text = "deeply fried" - else - owner.name = "the physical manifestation of fried foods" - owner.add_atom_colour(rgb(33,19,9), FIXED_COLOUR_PRIORITY) - frying_examine_text = "incomprehensibly fried to a crisp" - + //first we do some checks depending on the type of item being fried var/list/fried_tastes = list("crispy") var/fried_foodtypes = FRIED var/fried_junk = FALSE @@ -65,7 +49,33 @@ GLOBAL_LIST_INIT(frying_bad_chems, list( fried_tastes += food_item.tastes fried_foodtypes |= food_item.foodtype - owner.AddComponent(/datum/component/edible, foodtypes = fried_tastes, tastes = fried_tastes, eat_time = 0) + var/fried_eat_time = 0 + if(isturf(owner)) + fried_eat_time = 30 //we want turfs to be eaten slowly + + var/colour_priority = FIXED_COLOUR_PRIORITY + if(ismob(owner)) + colour_priority = WASHABLE_COLOUR_PRIORITY //badmins fried someone and we want to let them wash the fry colour off + else + owner.AddComponent(/datum/component/edible, foodtypes = fried_tastes, tastes = fried_tastes, eat_time = fried_eat_time) //we don't want mobs to get the edible component + + switch(fry_power) + if(0 to 15) + owner.name = "lightly fried [owner.name]" + owner.add_atom_colour(rgb(166,103,54), colour_priority) + frying_examine_text = "lightly fried" + if(16 to 49) + owner.name = "fried [owner.name]" + owner.add_atom_colour(rgb(103,63,24), colour_priority) + frying_examine_text = "moderately fried" + if(50 to 59) + owner.name = "deep fried [owner.name]" + owner.add_atom_colour(rgb(63,23,4), colour_priority) + frying_examine_text = "deeply fried" + else + owner.name = "the physical manifestation of fried foods" + owner.add_atom_colour(rgb(33,19,9), colour_priority) + frying_examine_text = "incomprehensibly fried to a crisp" //adding the edible component gives it reagents meaning we can now add the bad frying reagents if it's junk if(fried_junk && owner.reagents) //check again just incase @@ -87,3 +97,9 @@ GLOBAL_LIST_INIT(frying_bad_chems, list( else if(owner.name == "the physical manifestation of fried foods") //if the name is still this, their name hasn't changed, so we can safely restore their stored name owner.name = stored_name + +/datum/component/fried/proc/restore() //restore a fried mob to being not-fried + if(ismob(owner)) + //restore the name, the colour should wash off itself, and then remove the component + restore_name() + RemoveComponent() From b06948bed4eb8f9d9a87476acb596fa85f8ca2fa Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 20 Jul 2020 17:48:37 +0100 Subject: [PATCH 084/122] fry smite --- code/__DEFINES/admin.dm | 1 + code/datums/components/fried.dm | 2 ++ code/modules/admin/verbs/randomverbs.dm | 16 +++++++++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 054a8e36eb..6a0cd3b8ee 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -75,6 +75,7 @@ #define ADMIN_PUNISHMENT_PIE "Cream Pie" #define ADMIN_PUNISHMENT_CUSTOM_PIE "Custom Cream Pie" #define ADMIN_PUNISHMENT_PICKLE "Pickle-ify" +#define ADMIN_PUNISHMENT_FRY "Fry" #define AHELP_ACTIVE 1 #define AHELP_CLOSED 2 diff --git a/code/datums/components/fried.dm b/code/datums/components/fried.dm index c0ffa8cd0f..4e21962778 100644 --- a/code/datums/components/fried.dm +++ b/code/datums/components/fried.dm @@ -56,6 +56,8 @@ GLOBAL_LIST_INIT(frying_bad_chems, list( var/colour_priority = FIXED_COLOUR_PRIORITY if(ismob(owner)) colour_priority = WASHABLE_COLOUR_PRIORITY //badmins fried someone and we want to let them wash the fry colour off + //lets heavily hint at how to undo their frying + to_chat(owner, "You've been coated in hot cooking oil! You should probably go wash it off at the showers.") else owner.AddComponent(/datum/component/edible, foodtypes = fried_tastes, tastes = fried_tastes, eat_time = fried_eat_time) //we don't want mobs to get the edible component diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 9b36fd7a2a..5027e8fe51 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1269,7 +1269,19 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits if(!check_rights(R_ADMIN) || !check_rights(R_FUN)) return - var/list/punishment_list = list(ADMIN_PUNISHMENT_PIE, ADMIN_PUNISHMENT_CUSTOM_PIE, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_SUPPLYPOD_QUICK, ADMIN_PUNISHMENT_SUPPLYPOD, ADMIN_PUNISHMENT_MAZING, ADMIN_PUNISHMENT_ROD, ADMIN_PUNISHMENT_PICKLE) + var/list/punishment_list = list(ADMIN_PUNISHMENT_PIE, + ADMIN_PUNISHMENT_CUSTOM_PIE, + ADMIN_PUNISHMENT_FIREBALL, + ADMIN_PUNISHMENT_LIGHTNING, + ADMIN_PUNISHMENT_BRAINDAMAGE, + ADMIN_PUNISHMENT_BSA, + ADMIN_PUNISHMENT_GIB, + ADMIN_PUNISHMENT_SUPPLYPOD_QUICK, + ADMIN_PUNISHMENT_SUPPLYPOD, + ADMIN_PUNISHMENT_MAZING, + ADMIN_PUNISHMENT_ROD, + ADMIN_PUNISHMENT_PICKLE, + ADMIN_PUNISHMENT_FRY) var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list @@ -1349,6 +1361,8 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits A.splat(target) if(ADMIN_PUNISHMENT_PICKLE) target.turn_into_pickle() + if(ADMIN_PUNISHMENT_FRY) + target.fry() punish_log(target, punishment) From 57126cba74e620b170f3a8945a12501ff7231006 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jul 2020 12:49:12 -0500 Subject: [PATCH 085/122] Automatic changelog generation for PR #12830 [ci skip] --- html/changelogs/AutoChangeLog-pr-12830.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12830.yml diff --git a/html/changelogs/AutoChangeLog-pr-12830.yml b/html/changelogs/AutoChangeLog-pr-12830.yml new file mode 100644 index 0000000000..c6b05a73be --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12830.yml @@ -0,0 +1,4 @@ +author: "Funce" +delete-after: True +changes: + - bugfix: "Genetics spiderwebs are no longer impassable walls" From 4b70e29e36b46df9bc6ad602f0c7feec6842e8dd Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 20 Jul 2020 19:42:07 +0100 Subject: [PATCH 086/122] let the fry smite work --- code/modules/food_and_drinks/food/snacks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 3c26ff7048..adb8e47c94 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -414,5 +414,5 @@ All foods are distributed among various categories. Use common sense. var/obj/item/fried_item = src if(fried_item.resistance_flags & INDESTRUCTIBLE) return - if(!GetComponent(/datum/component/fried) && (!reagents || isfood(src))) + if(!GetComponent(/datum/component/fried) && (!reagents || isfood(src) || ismob(src))) AddComponent(/datum/component/fried, frying_power = cook_time) From 3676b03f28ee590b6a2045b074aba107b13fede3 Mon Sep 17 00:00:00 2001 From: kappa-sama <44128284+kappa-sama@users.noreply.github.com> Date: Mon, 20 Jul 2020 14:53:22 -0400 Subject: [PATCH 087/122] experiment --- code/modules/mining/lavaland/necropolis_chests.dm | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 3b5ff71705..fae129637c 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -11,7 +11,7 @@ desc = "It's watching you suspiciously." /obj/structure/closet/crate/necropolis/tendril/PopulateContents() - var/loot = rand(1,29) + var/loot = rand(1,28) switch(loot) if(1) new /obj/item/shared_storage/red(src) @@ -77,11 +77,6 @@ new /obj/item/bedsheet/cult(src) if(28) new /obj/item/clothing/neck/necklace/memento_mori(src) - if(29) - if(prob(50)) - new /obj/item/malf_upgrade - else - new /obj/item/disk/tech_disk/illegal //KA modkit design discs /obj/item/disk/design_disk/modkit_disc From 2351e464d640f402c115142fea3589cfc85d3e3a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jul 2020 18:15:42 -0500 Subject: [PATCH 088/122] Automatic changelog generation for PR #12646 [ci skip] --- html/changelogs/AutoChangeLog-pr-12646.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12646.yml diff --git a/html/changelogs/AutoChangeLog-pr-12646.yml b/html/changelogs/AutoChangeLog-pr-12646.yml new file mode 100644 index 0000000000..157e124c60 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12646.yml @@ -0,0 +1,5 @@ +author: "Chiirno" +delete-after: True +changes: + - rscadd: "Alt-click pill bottles places top-most pill into active hand." + - tweak: "Moved dice bags from pill_bottle/dice to box/dice to avoid dice bags being affected from medical specific pill bottle changes." From 0ef5753a92dff8dc932cbd6a77418d63e4e7966b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jul 2020 18:17:48 -0500 Subject: [PATCH 089/122] Automatic changelog generation for PR #12728 [ci skip] --- html/changelogs/AutoChangeLog-pr-12728.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12728.yml diff --git a/html/changelogs/AutoChangeLog-pr-12728.yml b/html/changelogs/AutoChangeLog-pr-12728.yml new file mode 100644 index 0000000000..9a4bfb5716 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12728.yml @@ -0,0 +1,4 @@ +author: "silicons" +delete-after: True +changes: + - rscadd: "voting can now be done from the stat panel if the system is plurality and approval" From 401eeafa82ddedc3e5c39a11d43ad6d3a46c22a8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jul 2020 18:18:24 -0500 Subject: [PATCH 090/122] Automatic changelog generation for PR #12766 [ci skip] --- html/changelogs/AutoChangeLog-pr-12766.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12766.yml diff --git a/html/changelogs/AutoChangeLog-pr-12766.yml b/html/changelogs/AutoChangeLog-pr-12766.yml new file mode 100644 index 0000000000..38af0da8f9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12766.yml @@ -0,0 +1,4 @@ +author: "silicons" +delete-after: True +changes: + - imageadd: ":dsmile: :dfrown: :dhsmile: :dpog: :dneutral:" From a810a1dc6348005ca85330c2a0ef1114a9d0c2ed Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jul 2020 18:20:12 -0500 Subject: [PATCH 091/122] Automatic changelog generation for PR #12786 [ci skip] --- html/changelogs/AutoChangeLog-pr-12786.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12786.yml diff --git a/html/changelogs/AutoChangeLog-pr-12786.yml b/html/changelogs/AutoChangeLog-pr-12786.yml new file mode 100644 index 0000000000..159adc79fb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12786.yml @@ -0,0 +1,6 @@ +author: "silicons" +delete-after: True +changes: + - tweak: "survivalists (from summon guns/magic) are proper objective'd pseudoantagonists again" + - tweak: "summon guns/magic can only be used once each" + - tweak: "summon guns/magic now only cost one point each" From ffde1709ea73d4f67457fd65e7064fbcf65ff71f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jul 2020 18:21:59 -0500 Subject: [PATCH 092/122] Automatic changelog generation for PR #12823 [ci skip] --- html/changelogs/AutoChangeLog-pr-12823.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12823.yml diff --git a/html/changelogs/AutoChangeLog-pr-12823.yml b/html/changelogs/AutoChangeLog-pr-12823.yml new file mode 100644 index 0000000000..f189b3d288 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12823.yml @@ -0,0 +1,4 @@ +author: "silicons" +delete-after: True +changes: + - bugfix: "gravity should update for mobs a fair bit faster" From 2ec64f3e055e5e56bb4661c01ceba7455fe6c804 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 20 Jul 2020 16:50:56 -0700 Subject: [PATCH 093/122] Update wizard.dm --- code/modules/spells/spell_types/wizard.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm index b104c2182a..13c47ab9ac 100644 --- a/code/modules/spells/spell_types/wizard.dm +++ b/code/modules/spells/spell_types/wizard.dm @@ -371,7 +371,7 @@ if(isliving(hit_atom)) var/mob/living/M = hit_atom if(!M.anti_magic_check()) - M.electrocute_act(80, src, SHOCK_ILLUSION) + M.electrocute_act(80, src, null, SHOCK_ILLUSION) qdel(src) /obj/item/spellpacket/lightningbolt/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) From 2e09ecee4c83b3ccfaffb0e4ae1e2c21a509c577 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jul 2020 18:54:28 -0500 Subject: [PATCH 094/122] Automatic changelog generation for PR #12749 [ci skip] --- html/changelogs/AutoChangeLog-pr-12749.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12749.yml diff --git a/html/changelogs/AutoChangeLog-pr-12749.yml b/html/changelogs/AutoChangeLog-pr-12749.yml new file mode 100644 index 0000000000..00c32485ee --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12749.yml @@ -0,0 +1,4 @@ +author: "TheSpaghetti" +delete-after: True +changes: + - rscadd: "new snowflake trait" From ef9a757a825f25444576e7a1b1c2ff336efaae5d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jul 2020 18:55:03 -0500 Subject: [PATCH 095/122] Automatic changelog generation for PR #12800 [ci skip] --- html/changelogs/AutoChangeLog-pr-12800.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12800.yml diff --git a/html/changelogs/AutoChangeLog-pr-12800.yml b/html/changelogs/AutoChangeLog-pr-12800.yml new file mode 100644 index 0000000000..020a216e8b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12800.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - bugfix: "Swarmers can once again eat items as long as there's nothing living in them." From 38557d0b2974ee009ab891e05dcdae924d161ae1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jul 2020 18:55:41 -0500 Subject: [PATCH 096/122] Automatic changelog generation for PR #12804 [ci skip] --- html/changelogs/AutoChangeLog-pr-12804.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12804.yml diff --git a/html/changelogs/AutoChangeLog-pr-12804.yml b/html/changelogs/AutoChangeLog-pr-12804.yml new file mode 100644 index 0000000000..05eff30c77 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12804.yml @@ -0,0 +1,4 @@ +author: "Arturlang" +delete-after: True +changes: + - bugfix: "Decal painter ui now works, yay?" From 53e18d0314c968ac2040e8f9a42fd8461f5e9f46 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jul 2020 18:56:25 -0500 Subject: [PATCH 097/122] Automatic changelog generation for PR #12826 [ci skip] --- html/changelogs/AutoChangeLog-pr-12826.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12826.yml diff --git a/html/changelogs/AutoChangeLog-pr-12826.yml b/html/changelogs/AutoChangeLog-pr-12826.yml new file mode 100644 index 0000000000..323c8a38e0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12826.yml @@ -0,0 +1,4 @@ +author: "Kraseo" +delete-after: True +changes: + - balance: "Damp rags no longer instantly apply their chemicals onto someone." From 12a09bee5281552b4600b9031e3f059933e8d205 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jul 2020 18:56:59 -0500 Subject: [PATCH 098/122] Automatic changelog generation for PR #12805 [ci skip] --- html/changelogs/AutoChangeLog-pr-12805.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12805.yml diff --git a/html/changelogs/AutoChangeLog-pr-12805.yml b/html/changelogs/AutoChangeLog-pr-12805.yml new file mode 100644 index 0000000000..b652197755 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12805.yml @@ -0,0 +1,4 @@ +author: "SiliconMain" +delete-after: True +changes: + - tweak: "Geigers can no longer be contaminated" From 3efe9c8c0003d6a4b24cb8a22e70d71b0345f576 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jul 2020 18:57:27 -0500 Subject: [PATCH 099/122] Automatic changelog generation for PR #12807 [ci skip] --- html/changelogs/AutoChangeLog-pr-12807.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12807.yml diff --git a/html/changelogs/AutoChangeLog-pr-12807.yml b/html/changelogs/AutoChangeLog-pr-12807.yml new file mode 100644 index 0000000000..a13e58d896 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12807.yml @@ -0,0 +1,4 @@ +author: "kappa-sama" +delete-after: True +changes: + - tweak: "quartered the weight of the stray cargo pod event from 2x normal to 1/2 normal" From 8c254744bf22389ef4373a5ac3d542dd1b4d1e87 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jul 2020 18:58:05 -0500 Subject: [PATCH 100/122] Automatic changelog generation for PR #12811 [ci skip] --- html/changelogs/AutoChangeLog-pr-12811.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12811.yml diff --git a/html/changelogs/AutoChangeLog-pr-12811.yml b/html/changelogs/AutoChangeLog-pr-12811.yml new file mode 100644 index 0000000000..3db0c85533 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12811.yml @@ -0,0 +1,4 @@ +author: "kappa-sama" +delete-after: True +changes: + - balance: "advanced surgery duffel bag no longer comes with a nukie medkit. it costs 4 less telecrystals to make up for this colossal nerf." From 9ea17928a5bc760eb87d3e51b834c2bc04f528ad Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jul 2020 18:59:40 -0500 Subject: [PATCH 101/122] Automatic changelog generation for PR #12829 [ci skip] --- html/changelogs/AutoChangeLog-pr-12829.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12829.yml diff --git a/html/changelogs/AutoChangeLog-pr-12829.yml b/html/changelogs/AutoChangeLog-pr-12829.yml new file mode 100644 index 0000000000..a666b5d3d2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12829.yml @@ -0,0 +1,5 @@ +author: "timothyteakettle" +delete-after: True +changes: + - rscadd: "new fried component used for frying objects" + - bugfix: "various frying bugs fixed such as being able to unfry items and frying turfs with cold cooking oil" From 9a798c7ba81264be678341df435d9fb0e40a831f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jul 2020 19:01:36 -0500 Subject: [PATCH 102/122] Automatic changelog generation for PR #12787 [ci skip] --- html/changelogs/AutoChangeLog-pr-12787.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12787.yml diff --git a/html/changelogs/AutoChangeLog-pr-12787.yml b/html/changelogs/AutoChangeLog-pr-12787.yml new file mode 100644 index 0000000000..9ecd6fd3be --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12787.yml @@ -0,0 +1,6 @@ +author: "CameronWoof" +delete-after: True +changes: + - rscadd: "Adds aloe, a new growable plant" + - rscadd: "Adds medicated sutures and advanced regenerative meshes" + - bugfix: "Polypyrylium oligomers and liquid electricity now correctly populate" From f4c5796b6d2f7c3412b8e2af151107dd27747871 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 21 Jul 2020 00:10:06 +0000 Subject: [PATCH 103/122] Automatic changelog compile [ci skip] --- html/changelog.html | 56 ++++++++++++++++++++++ html/changelogs/.all_changelog.yml | 40 ++++++++++++++++ html/changelogs/AutoChangeLog-pr-12646.yml | 5 -- html/changelogs/AutoChangeLog-pr-12728.yml | 4 -- html/changelogs/AutoChangeLog-pr-12749.yml | 4 -- html/changelogs/AutoChangeLog-pr-12766.yml | 4 -- html/changelogs/AutoChangeLog-pr-12786.yml | 6 --- html/changelogs/AutoChangeLog-pr-12787.yml | 6 --- html/changelogs/AutoChangeLog-pr-12800.yml | 4 -- html/changelogs/AutoChangeLog-pr-12804.yml | 4 -- html/changelogs/AutoChangeLog-pr-12805.yml | 4 -- html/changelogs/AutoChangeLog-pr-12807.yml | 4 -- html/changelogs/AutoChangeLog-pr-12811.yml | 4 -- html/changelogs/AutoChangeLog-pr-12823.yml | 4 -- html/changelogs/AutoChangeLog-pr-12826.yml | 4 -- html/changelogs/AutoChangeLog-pr-12829.yml | 5 -- html/changelogs/AutoChangeLog-pr-12830.yml | 4 -- 17 files changed, 96 insertions(+), 66 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-12646.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12728.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12749.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12766.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12786.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12787.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12800.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12804.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12805.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12807.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12811.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12823.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12826.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12829.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12830.yml diff --git a/html/changelog.html b/html/changelog.html index 28a790a46f..59426bb8d3 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,62 @@ -->
      +

      21 July 2020

      +

      Arturlang updated:

      +
        +
      • Decal painter ui now works, yay?
      • +
      +

      CameronWoof updated:

      +
        +
      • Adds aloe, a new growable plant
      • +
      • Adds medicated sutures and advanced regenerative meshes
      • +
      • Polypyrylium oligomers and liquid electricity now correctly populate
      • +
      +

      Chiirno updated:

      +
        +
      • Alt-click pill bottles places top-most pill into active hand.
      • +
      • Moved dice bags from pill_bottle/dice to box/dice to avoid dice bags being affected from medical specific pill bottle changes.
      • +
      +

      DeltaFire15 updated:

      +
        +
      • Swarmers can once again eat items as long as there's nothing living in them.
      • +
      +

      Funce updated:

      +
        +
      • Genetics spiderwebs are no longer impassable walls
      • +
      +

      Kraseo updated:

      +
        +
      • Damp rags no longer instantly apply their chemicals onto someone.
      • +
      +

      SiliconMain updated:

      +
        +
      • Geigers can no longer be contaminated
      • +
      +

      TheSpaghetti updated:

      +
        +
      • new snowflake trait
      • +
      +

      kappa-sama updated:

      +
        +
      • advanced surgery duffel bag no longer comes with a nukie medkit. it costs 4 less telecrystals to make up for this colossal nerf.
      • +
      • quartered the weight of the stray cargo pod event from 2x normal to 1/2 normal
      • +
      +

      silicons updated:

      +
        +
      • survivalists (from summon guns/magic) are proper objective'd pseudoantagonists again
      • +
      • summon guns/magic can only be used once each
      • +
      • summon guns/magic now only cost one point each
      • +
      • :dsmile: :dfrown: :dhsmile: :dpog: :dneutral:
      • +
      • gravity should update for mobs a fair bit faster
      • +
      • voting can now be done from the stat panel if the system is plurality and approval
      • +
      +

      timothyteakettle updated:

      +
        +
      • new fried component used for frying objects
      • +
      • various frying bugs fixed such as being able to unfry items and frying turfs with cold cooking oil
      • +
      +

      20 July 2020

      lolman360 updated:

        diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 97a1f5fda8..9c53b8387d 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -26421,3 +26421,43 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. lolman360: - tweak: Service borgs now have synthesizers instead of a violin and guitar. - bugfix: borg RSF +2020-07-21: + Arturlang: + - bugfix: Decal painter ui now works, yay? + CameronWoof: + - rscadd: Adds aloe, a new growable plant + - rscadd: Adds medicated sutures and advanced regenerative meshes + - bugfix: Polypyrylium oligomers and liquid electricity now correctly populate + Chiirno: + - rscadd: Alt-click pill bottles places top-most pill into active hand. + - tweak: Moved dice bags from pill_bottle/dice to box/dice to avoid dice bags being + affected from medical specific pill bottle changes. + DeltaFire15: + - bugfix: Swarmers can once again eat items as long as there's nothing living in + them. + Funce: + - bugfix: Genetics spiderwebs are no longer impassable walls + Kraseo: + - balance: Damp rags no longer instantly apply their chemicals onto someone. + SiliconMain: + - tweak: Geigers can no longer be contaminated + TheSpaghetti: + - rscadd: new snowflake trait + kappa-sama: + - balance: advanced surgery duffel bag no longer comes with a nukie medkit. it costs + 4 less telecrystals to make up for this colossal nerf. + - tweak: quartered the weight of the stray cargo pod event from 2x normal to 1/2 + normal + silicons: + - tweak: survivalists (from summon guns/magic) are proper objective'd pseudoantagonists + again + - tweak: summon guns/magic can only be used once each + - tweak: summon guns/magic now only cost one point each + - imageadd: ':dsmile: :dfrown: :dhsmile: :dpog: :dneutral:' + - bugfix: gravity should update for mobs a fair bit faster + - rscadd: voting can now be done from the stat panel if the system is plurality + and approval + timothyteakettle: + - rscadd: new fried component used for frying objects + - bugfix: various frying bugs fixed such as being able to unfry items and frying + turfs with cold cooking oil diff --git a/html/changelogs/AutoChangeLog-pr-12646.yml b/html/changelogs/AutoChangeLog-pr-12646.yml deleted file mode 100644 index 157e124c60..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12646.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Chiirno" -delete-after: True -changes: - - rscadd: "Alt-click pill bottles places top-most pill into active hand." - - tweak: "Moved dice bags from pill_bottle/dice to box/dice to avoid dice bags being affected from medical specific pill bottle changes." diff --git a/html/changelogs/AutoChangeLog-pr-12728.yml b/html/changelogs/AutoChangeLog-pr-12728.yml deleted file mode 100644 index 9a4bfb5716..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12728.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "silicons" -delete-after: True -changes: - - rscadd: "voting can now be done from the stat panel if the system is plurality and approval" diff --git a/html/changelogs/AutoChangeLog-pr-12749.yml b/html/changelogs/AutoChangeLog-pr-12749.yml deleted file mode 100644 index 00c32485ee..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12749.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TheSpaghetti" -delete-after: True -changes: - - rscadd: "new snowflake trait" diff --git a/html/changelogs/AutoChangeLog-pr-12766.yml b/html/changelogs/AutoChangeLog-pr-12766.yml deleted file mode 100644 index 38af0da8f9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12766.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "silicons" -delete-after: True -changes: - - imageadd: ":dsmile: :dfrown: :dhsmile: :dpog: :dneutral:" diff --git a/html/changelogs/AutoChangeLog-pr-12786.yml b/html/changelogs/AutoChangeLog-pr-12786.yml deleted file mode 100644 index 159adc79fb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12786.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "silicons" -delete-after: True -changes: - - tweak: "survivalists (from summon guns/magic) are proper objective'd pseudoantagonists again" - - tweak: "summon guns/magic can only be used once each" - - tweak: "summon guns/magic now only cost one point each" diff --git a/html/changelogs/AutoChangeLog-pr-12787.yml b/html/changelogs/AutoChangeLog-pr-12787.yml deleted file mode 100644 index 9ecd6fd3be..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12787.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "CameronWoof" -delete-after: True -changes: - - rscadd: "Adds aloe, a new growable plant" - - rscadd: "Adds medicated sutures and advanced regenerative meshes" - - bugfix: "Polypyrylium oligomers and liquid electricity now correctly populate" diff --git a/html/changelogs/AutoChangeLog-pr-12800.yml b/html/changelogs/AutoChangeLog-pr-12800.yml deleted file mode 100644 index 020a216e8b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12800.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DeltaFire15" -delete-after: True -changes: - - bugfix: "Swarmers can once again eat items as long as there's nothing living in them." diff --git a/html/changelogs/AutoChangeLog-pr-12804.yml b/html/changelogs/AutoChangeLog-pr-12804.yml deleted file mode 100644 index 05eff30c77..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12804.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arturlang" -delete-after: True -changes: - - bugfix: "Decal painter ui now works, yay?" diff --git a/html/changelogs/AutoChangeLog-pr-12805.yml b/html/changelogs/AutoChangeLog-pr-12805.yml deleted file mode 100644 index b652197755..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12805.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SiliconMain" -delete-after: True -changes: - - tweak: "Geigers can no longer be contaminated" diff --git a/html/changelogs/AutoChangeLog-pr-12807.yml b/html/changelogs/AutoChangeLog-pr-12807.yml deleted file mode 100644 index a13e58d896..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12807.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kappa-sama" -delete-after: True -changes: - - tweak: "quartered the weight of the stray cargo pod event from 2x normal to 1/2 normal" diff --git a/html/changelogs/AutoChangeLog-pr-12811.yml b/html/changelogs/AutoChangeLog-pr-12811.yml deleted file mode 100644 index 3db0c85533..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12811.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kappa-sama" -delete-after: True -changes: - - balance: "advanced surgery duffel bag no longer comes with a nukie medkit. it costs 4 less telecrystals to make up for this colossal nerf." diff --git a/html/changelogs/AutoChangeLog-pr-12823.yml b/html/changelogs/AutoChangeLog-pr-12823.yml deleted file mode 100644 index f189b3d288..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12823.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "silicons" -delete-after: True -changes: - - bugfix: "gravity should update for mobs a fair bit faster" diff --git a/html/changelogs/AutoChangeLog-pr-12826.yml b/html/changelogs/AutoChangeLog-pr-12826.yml deleted file mode 100644 index 323c8a38e0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12826.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kraseo" -delete-after: True -changes: - - balance: "Damp rags no longer instantly apply their chemicals onto someone." diff --git a/html/changelogs/AutoChangeLog-pr-12829.yml b/html/changelogs/AutoChangeLog-pr-12829.yml deleted file mode 100644 index a666b5d3d2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12829.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "timothyteakettle" -delete-after: True -changes: - - rscadd: "new fried component used for frying objects" - - bugfix: "various frying bugs fixed such as being able to unfry items and frying turfs with cold cooking oil" diff --git a/html/changelogs/AutoChangeLog-pr-12830.yml b/html/changelogs/AutoChangeLog-pr-12830.yml deleted file mode 100644 index c6b05a73be..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12830.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Funce" -delete-after: True -changes: - - bugfix: "Genetics spiderwebs are no longer impassable walls" From c27f33904993088b758fec4ebfa55d31675ab73f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 20 Jul 2020 19:25:57 -0500 Subject: [PATCH 104/122] Automatic changelog generation for PR #12824 [ci skip] --- html/changelogs/AutoChangeLog-pr-12824.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12824.yml diff --git a/html/changelogs/AutoChangeLog-pr-12824.yml b/html/changelogs/AutoChangeLog-pr-12824.yml new file mode 100644 index 0000000000..5723117238 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12824.yml @@ -0,0 +1,4 @@ +author: "kappa-sama" +delete-after: True +changes: + - balance: "brainwashing disk has lost its cost buffs (3->5) and is role restricted once more (medical doctor/roboticist)" From c92abfe2ce524176bad153d5740b78116d4d3dee Mon Sep 17 00:00:00 2001 From: kappa-sama <44128284+kappa-sama@users.noreply.github.com> Date: Mon, 20 Jul 2020 21:18:39 -0400 Subject: [PATCH 105/122] bruh --- code/modules/mining/lavaland/necropolis_chests.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index fae129637c..bfdb731869 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -11,7 +11,7 @@ desc = "It's watching you suspiciously." /obj/structure/closet/crate/necropolis/tendril/PopulateContents() - var/loot = rand(1,28) + var/loot = rand(1,29) switch(loot) if(1) new /obj/item/shared_storage/red(src) @@ -77,6 +77,11 @@ new /obj/item/bedsheet/cult(src) if(28) new /obj/item/clothing/neck/necklace/memento_mori(src) + if(29) + if(prob(50)) + new /obj/item/malf_upgrade(src) + else + new /obj/item/disk/tech_disk/illegal(src) //KA modkit design discs /obj/item/disk/design_disk/modkit_disc From 8adfe633e3067796c02821e90d26be1eb5f169dc Mon Sep 17 00:00:00 2001 From: YakumoChen Date: Tue, 21 Jul 2020 01:27:22 +0000 Subject: [PATCH 106/122] Fixes MK --- modular_citadel/code/datums/status_effects/chems.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 47eef6a820..5356214438 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -230,7 +230,7 @@ var/mob/living/carbon/M = owner //chem calculations - if(!owner.reagents.has_reagent(/datum/chemical_reaction/fermi/enthrall)) + if(!owner.reagents.has_reagent(/datum/reagent/fermi/enthrall)) if (phase < 3 && phase != 0) deltaResist += 3//If you've no chem, then you break out quickly if(prob(5)) From 3faa9d6f13e827dd7d0129ab843622e2f7789846 Mon Sep 17 00:00:00 2001 From: Putnam Date: Mon, 20 Jul 2020 19:58:44 -0700 Subject: [PATCH 107/122] Chat queue optimization. To be exact, makes it only do the expensive text replacement when there's a client to receive the text. --- code/controllers/subsystem/chat.dm | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm index bbeb0683f0..ba2794d00f 100644 --- a/code/controllers/subsystem/chat.dm +++ b/code/controllers/subsystem/chat.dm @@ -31,19 +31,13 @@ SUBSYSTEM_DEF(chat) //Some macros remain in the string even after parsing and fuck up the eventual output var/original_message = message - message = replacetext(message, "\improper", "") - message = replacetext(message, "\proper", "") - if(handle_whitespace) - message = replacetext(message, "\n", "
        ") - message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]") - if (trailing_newline) - message += "
        " //url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript. //Do the double-encoding here to save nanoseconds - var/twiceEncoded = url_encode(url_encode(message)) + var/twiceEncoded if(islist(target)) + var/sanitized_message = FALSE for(var/I in target) var/client/C = CLIENT_FROM_VAR(I) //Grab us a client if possible @@ -55,6 +49,17 @@ SUBSYSTEM_DEF(chat) if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file. continue + + if(!sanitized_message) + message = replacetext(message, "\improper", "") + message = replacetext(message, "\proper", "") + if(handle_whitespace) + message = replacetext(message, "\n", "
        ") + message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]") + if (trailing_newline) + message += "
        " + twiceEncoded = url_encode(url_encode(message)) + sanitized_message = TRUE if(!C.chatOutput.loaded) //Client still loading, put their messages in a queue C.chatOutput.messageQueue += message @@ -74,6 +79,15 @@ SUBSYSTEM_DEF(chat) if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file. return + message = replacetext(message, "\improper", "") + message = replacetext(message, "\proper", "") + if(handle_whitespace) + message = replacetext(message, "\n", "
        ") + message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]") + if (trailing_newline) + message += "
        " + twiceEncoded = url_encode(url_encode(message)) + if(!C.chatOutput.loaded) //Client still loading, put their messages in a queue C.chatOutput.messageQueue += message return From fb35248e3bf431bcba26f25a36403c0e2485464f Mon Sep 17 00:00:00 2001 From: zerothebigboy Date: Tue, 21 Jul 2020 02:24:22 -0400 Subject: [PATCH 108/122] a --- code/modules/clothing/gloves/miscellaneous.dm | 12 ++++++++++++ code/modules/clothing/head/misc.dm | 7 +++++++ code/modules/vending/autodrobe.dm | 2 ++ code/modules/vending/kinkmate.dm | 2 ++ icons/mob/clothing/hands.dmi | Bin 10922 -> 11129 bytes icons/mob/clothing/head.dmi | Bin 227652 -> 227735 bytes icons/obj/clothing/gloves.dmi | Bin 18541 -> 18863 bytes icons/obj/clothing/hats.dmi | Bin 110779 -> 110943 bytes .../code/modules/client/loadout/gloves.dm | 7 ++++++- .../code/modules/client/loadout/head.dm | 5 +++++ 10 files changed, 34 insertions(+), 1 deletion(-) diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index a8017631bd..b06636ea2e 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -196,3 +196,15 @@ transfer_prints = FALSE strip_mod = 5 strip_silence = TRUE + +/obj/item/clothing/gloves/evening + name = "evening gloves" + desc = "Thin, pretty gloves intended for use in regal feminine attire, but knowing Space China these are just for some maid fetish." + icon_state = "evening" + item_state = "evening" + strip_delay = 40 + equip_delay_other = 20 + cold_protection = HANDS + min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + strip_mod = 0.9 + custom_price = PRICE_ALMOST_CHEAP diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 73675257e4..416d0d2383 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -446,3 +446,10 @@ /obj/item/clothing/head/kepi/old icon_state = "kepi_old" desc = "A flat, white circular cap with a visor, that demands some honor from it's wearer." + +/obj/item/clothing/head/maid + name = "maid headband" + desc = "Maid in China." + icon_state = "maid" + item_state = "maid" + dynamic_hair_suffix = "" diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index 9dfb4c76a0..260b124283 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -84,8 +84,10 @@ /obj/item/clothing/suit/poncho = 1, /obj/item/clothing/suit/poncho/green = 1, /obj/item/clothing/suit/poncho/red = 1, + /obj/item/clothing/head/maid = 1, /obj/item/clothing/under/costume/maid = 1, /obj/item/clothing/under/rank/civilian/janitor/maid = 1, + /obj/item/clothing/gloves/evening = 1, /obj/item/clothing/glasses/cold=1, /obj/item/clothing/glasses/heat=1, /obj/item/clothing/suit/whitedress = 1, diff --git a/code/modules/vending/kinkmate.dm b/code/modules/vending/kinkmate.dm index c416d87439..3d94cb4ab4 100644 --- a/code/modules/vending/kinkmate.dm +++ b/code/modules/vending/kinkmate.dm @@ -6,7 +6,9 @@ product_slogans = "Kinky!;Sexy!;Check me out, big boy!" vend_reply = "Have fun, you shameless pervert!" products = list( + /obj/item/clothing/head/maid = 5, /obj/item/clothing/under/costume/maid = 5, + /obj/item/clothing/gloves/evening = 5, /obj/item/clothing/under/rank/civilian/janitor/maid = 5, /obj/item/clothing/neck/petcollar = 5, /obj/item/clothing/neck/petcollar/choker = 5, diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi index 856fe2149ac75951320d152798ac3dedad1518ea..e37229193944d3288f92f44bfbebf1b3a506e74e 100644 GIT binary patch literal 11129 zcmb_?2UJsO*DlH^BPz^@hzJ-*dRGu4gb*D?K$=Jg0hQiWdVs_>DAJ@$mtI1VUP2NT z0jZG^kP;%@&;o=I0wK8vo$s#u-?jev{_n1vwNB1?-?LBNo&D^6-rXW@8EPNrKEuty z!Eszy=lX39jsx%ak6#Z1Gb-YZzQEuS+|<(Vx|6TNBew^BZa&@|96=dLgevc67k)eZ zO)%@@&EeXcX=QR|xiZ%_xcl$f_Yh*D`wn-F2fn?HuEoaaWdF{jgUSd?~9OqxE zH&e{0uiu}GoZ`!ib1?p6)e$XMaoN@JLkOdocyg2|ckGXlo;hWOV`IU_pP)(Cwyk}k zjvqqBA<5Ufm=#<8PG4Hf&eV~-1JXf7QWKpn;lkZ!90>hmm~ZTZ8Naq={1N;9e%4ip zz4yq+%kD4cuF8GAP6`y;{!TyUD+dw2$h_EGr*0d&7^F6mZO>u#vQ2&E2nWYG4&Ccl zO@lI4CXk_~v`or6J+((Hp;K&@>&VNi=RZ6?fBo0rOfRff%SD&BP3A6J6JNm25-{bM z`ey%;tq%bW9>k@|3R}hH`hww|#>L^>K#)+~-4Pp`QnM?!e)nAG`t3;WbI_C5q}16E z_OI6xF6j2D`5HQ(u*Y}g@%lf)X44mTp`DCAHD&Y(KqLNx&-=fco10hK->lfwdyd*! zSTqn<-^c^k;P$U)6DkY*Q-+Xjh-sj$JsMz@T-V#XFGj=>c0}w z7w}M*sEf|s$?}C26@BI_&CTjHPTi**qN<=0wp8NgtoHnax?TJ}-GbZJn2J)N)x0E3 zL7BHQcC2)7ZKs&g8QUG@mTZN-p-WRf!*~+MbNSKsyHXTN#ceo8 zbQFbP1)vPKOY`XBb9()*L&H`5uBMUP)$L}8^M>$^1QOMNMzSxZV!n48A@G58>^tw~ zdb@?W%`tUWONJfM&kGYkIT{gTW)jZuG3+*HC1DFfOJrU0kJT1CjrR73>*6zi zxrnNNQJ==di;=H*Tv5~z>Q}2-@v?NwwzsfY*zQkDzerBYezjxB7{x~&_fbdG&O7Tj z&llxlO%Piq`y|G>{|CvKO7-6M#nmZVe?ACVsHgcKApMV|uVs=44|t4xo>=!M_ZM{y z-L|i+WVXIP156!5^vXuKSK5m5$;%EJj0}4a*#lO4VtIvy?VDShQfUc!^)WnNlP$rY z##B^PBu?<43hK;qn7*HV@7y)zbOFdKWyJ{rUN@OXZ0GG1*kg1NZ#GLfhrAj8- zY1R5l1@U9zA~kBxjn;$W{!O3piM5KI%qh5f$tS98LexlVD?tGg79;VQ82Zfn%qT{& zEWM(9B+n>`rd4<=lsb-4lq+f7-BDAMNxN*Ur5c-UZ4I9%jjP8~BndyT!7ZdO(v1B7 z)|GLE64R{;zx7_cUMde&8QKRb(+d-dNnAwXPLi0-cVc)Ok0Yi=Us^9N5qaqPdSMv5 zAk}G)_NqK>!h^N9MbrHTBv1;lfV4V~Sv?pa zvqC_;#$I4RhA@6w=0;8S58;^@lceo;OX7`_T0J8Fr4|J?uz$q%Ke+jrt85B!*@yKf zUuU0b?Kz9+7cu1M5qqJn?d>=5(pv6r>IL;%3j4?+8?y?N?B2SlY8E7$ln;N)4#`xz zv*PL;N|{fE_a-#GfnEK%7?+~k#~img(Cj+R;izx?Mq|Ip?IUP6Lc zl3`~21(ITfdq>Ec2e!nHZMr}GiDC4d3d8oX*JnD+%*_j1S~P4r7Ut$kfZy+k1%db& zqTY|={mN(#DreQ5QFmu@9Mp$*s>&T!Zu%pTD=PJ^qTzsV7ij(rgFQCPJ2=lodM&-+ zgj21rU3-?6p6(?wJ~2@i9v;4)00ZQ!3>-7`H-5cFj>B34+t#F#V5&fxm4NLxJ=l-G zBKeU)M*uGZ$qilgA95pvGc#6x*RU%Kx-wq4I zoDmYLa~qWKSi^JS=98}1d3bmj=;}svb#>Kxjn~)g=(Y=_;4fy|!LjwBUrM%;6X4%n zY;Kf=EiAT4K-8~B7CDg@6jw%K?Y_=6XPYj>4h>duzUV7ux6S$fuw>TshFanG7HMox zU|Y}qns?{zeZW?){Oif1BRnydyNiDnNW9_iUp|;OG6~JGZ}I))4=d>dl@!&B8n_Vb zFV=hw+SfFGsNR=##3gXEqq(5#e>tP)1j#1q7L6Xw)D<1@+ zC$Ntld@Gqy=0+!0LRc%@HV&)7vqt!+)EaWZ#Y{?JQOH?_30`?7yi3m+TcLVI*WK0i zmV-my_*9mgr>7~PDwTrhE!8F07nq~V{V_Z%W8)eX8+@a64OSgI!W&Q*vHepRc2@{J zG~q!xI6g6+w-;?YBLj;APVSI_*^oY+v6xE?Rgx|8VTxvu%6aMp$=!GJjE#fp-ZVqm zA%LJDG6-zzW1Eo+P<)h-3?9#rFtxGqFfX@ux*_T1h%zr%0_+sKNd*Aw$wUc2O823i zkL+Fu+E+Uau(tv3005mY?c;6jx=K4sck>>(t$YCM5JEzBXeOly=i)cm-RF)L1U!h6 zVv1=qjq{&0@PBv@TOGdhfh8m>Ssp@djTJAcLuh|9XFY?E%rPOfi>jlP& zk=HT3S(~RY^W8V%^3L;KpJOK2q)HT|zBq1ZJ4nchdJr>a$8@vKWPb*+o5*C>q$EM}j!JOQfX&))N!S7o zqYY&vJ_q#n;AFt&=2y&}uZWP~9sY_RY>LjvLar5Jw5veiuN8cag`a+LnJrzoh0eoj zm+f}^b;Ig_)uGg^VcMVVG?OT|#d!4)!tV4#BRJZ<$w{oFMsH`%*#SMjh_{kZHsL;0 zpq=#&reKUPPaYbT_6q%g$m~YRo2YB4!$W7WoY(g564OD57C-l#(!S1-WnD&nI`$k) zLmDD%u4PCp-+nDwn*95t_IISNV#<3omKS41+ zOsA6=!T0!GUii^7B3ua3pqZlUf`Rx{*H<;y)M1LtR-k?ltfxc|Mn712L7L9AifIq8 zsZq(PzRjQtxPG)Rdq~im%nl=-WOaf{0MS4ceL4y3E+FXZiWgOhoa4w*6S)^Tsk${s7Q?nEe6WKVah z9Wgb!;Jy-9eUSU4GqBc$Z*M$q{#fg2gQ3ckkNVQG=jygLX=(YWWSjXX=vSNcz?1I% z;#ajDYHAA7VJSrrAE_?@4i#|5go_-tKyj8l(Dl+#6(S_Wqo;CIwE3RX^=|iYJm?YU zon-sBci#_8ZM{JtTMR4=dh1l;7>9CVNs#`EYhFb4e!@%{6~X=S>RjLxO_$$Fc`7rl6SE#~9VJ^N(I{)~1Zj@}KXK(k;=Ji49)pUJ_ zBJQYNs=X4lYzE|?Im%r2R(RrZGs-QpQdU^Q}#&ja+n-CC#W|iEInMF5$q&$r|EjrQ32k|?S6r!4@T#%nd;b0Rd+iz zb4?zfQ@B(1F-b2`xl;d?zur^^)-Iv9YmxAjyM&pmPYa-Zo*hRQTj#)-2s=|}X}=gW zj%$#Bifw>|E`dPfL|NZP6Piz5rys4k^r9stvP0hKaQ>&J|Be}3ms+pMP zwO1PDDk%z7vD)mq`2i;ZyEw@~wFjCB0t+72S~^;MawTYsu46$Pzt+~6z$sUXZc1|T zN9wAn8ab?O_D*~FG>{$jV&Su^62)j6cTMq3NarZANUZJtKt#g8{EEoV_wPS|fk3QH z-|&A~e(G6{ef!y%Gv(w$v6!&w!*lucv@zl6XvpyICIK-8-H{o%XGago*(PR}2u{g~ zxKRR$lQ?qcE6k`{4I)Jr+@)R=bX6uj9y!)cLKY#;(!^-p0>+8sJ7S+Zs#o9MqP=JHJW zY1bQd6SX7(Y0(a}O6OmbE}*u6xZ

        )jWutoeCd{sI=r|^mnnpfuq$zAYGI{z26PvD~LFbcP+ zP>Z)Hvp_Od$1|&|53@8u2$U8;XYl0p$3LWZV+3#bOmm&hYdNZ%KE=vP8rRQ*ed zIT^RY^Asz^N|hmLc?~w!B6B3DOK$4vUrWl-7VI^2YZk&%guP68U^DVKYdZECX6Inn ztrK(md$)v^lDKpU?W`QUH^rc_%#^6jL!RaH5D7aXE((#6l^yR-u{c3EGA|$-F#R%5 zG2nV7qqVE-7#E|$Rh;{chlkQ zn*RQjTV*=8%maS%$S2ixn^I+{&G5#x%;ax<+h-_qlYHa9Jh}dIbG*C{`}_oto>gie zwk5u}@3{uqv8E=p!G7}pgMcgW)YjcF;xcmo}!2UktT1HAHSQh5xQAkL%3I@)} zk)QpT$SKg<(6c^s+a^6RMb@^i#YcHr5qot<+PK}UTRtIWd}MrmCJeJf3$ts3Y~Qdr_@+SA>-Vx89FnANhWrsFo=`z6WjE^u7ySjM>1~*8Ef$vof%LK%- zyz<=%%f7(D1fnMKv<$w8p;_Df=}nyyZ@I!nMG~~rd?kgF<;bEX9|io;ZooIK9xoEQ zHbS~9E*G=^F%q~65%~eyIIZukrVqQ8! zC4A&(oy}fllytr8Ua(_z#NW{FK)Ov*egyX+8zxGa%gvlo*YkVyOU5_9TPW~ z5oft?;z*=|9xD)*(wz5)W8co&9*IJ^Ep>T~=7nzFw6`%T9p98vuBp_n6oJ4^V`1yh z%MEDjl3DL!M4;+`Q!iLr)SC|8-C}s;j$!e1*VgYbdJW9}ij`y|=w3Zyp!o0Ma52q~ z@TmJv-GtIJSR}e-XL*GAT54fq5u0@)OyP)FTjxwiL#nb1rPL{ua! zS%{ZmN1K(zEgbzHI@te~EI*TSbKbTy)Iv!}%)zB6e6XXVBYG|r3>{q=jLz9$rcnZ& z+3!6omF6Ke$h%oqYiZ?Uc)6h7O%OO4Nc=c97=gpPs2*4_3H(7L*tN8Yfju(MGH9!J zC*exI{@+x4$jXc|90?77u#J89HcQ7C18? zkF51T&si9~C|k)>S0HX^qw8%Dv|1mRj(;JL41yAc8*K|4uUI#|D~9GDQE3Cp%z{pVf@f^T%318J&2BdNA{}08$QocH?KXH1fY8qL>*WHhi&w>Ob_~ z3v>04klf2x2mM>Y{~LnGRj9@3M<)Icn*>*?$nk95l>KZMOVYM<1V&(F|MJ8X{CX98 zH!6d5-puxnH}-A|gQ(}vxEX;45ZapVtv_Oo za%itTcZyzY^y>!oP$E$_-m2V?pHD0&1h7zNZ7!4oLS&aUYx-1pHwEXNYx>H8Q{Lrr z4oSL5O5Nl1WfxA@9OT2yC*^GH&}aSU4-Mi+fTID^XeN-7zWoMJ+|PW;Dvm}7tg^5S zp3j#rTOdEbEz-PQ?>_U(|Ij1%-5F* z`_XV>_Fg`G&m?m{=?gs6ZKM@eG*JHktOJiX9SWKc+?8Xr+oJTDBnonkT)Vxi+mZFS z>fGza!>=c?4@YDM*$0%RMD!X(vf}Ry#aBtHNIGT3vUynI;rZ&04ie zzBh?ho^70mb}MO+TMaVltH%T@H~45X&d?jr?0wJTzj9nGi;o~SBj%2ccTgso;CbMe zOqHs}YeFRjwzeha%n-=AL8@OV;|=%uFt8Q*K?6S}=iGg=DfMEK5uU2y;DX+ZTxwv2 zJ`LVc^#Q*u@;RF7v&Zg6fziRLHi26!QSJ7+7 z!v=ZRz$@&<+&usOeCiNr4!mmZR65^#TPwI~Wg-Mo0bltYJ&kK0nk4YS_#0?ck2P&Uy|a?&($N+o4}C*(oycYUq~S755N zl12w|H?9n%e*$FDle_U)re=3>EG|wQ+ALZKkV2JTIKp50qR-}i=vD!}8qJeYjMWop z^?poBJ*_%2*J$%)>5)=TphS3rx?oA4k*TuX$kJHnOFAC~k7_ofI_t*QueuKnjB$Aq zSLDjW-UD1de826u9OMwIig{Z&_ zm}n}^GMRSkT?jahI(Of11(Z~J?tbmkgUa%UI7mOL5+e+$0h}Z3Xy}U5Ze4)Lsu>%b zJ$_H4NiXmx&qlMGzy_|9o=%(@=zJ&i4KF*tl+|l9x0wsKH4JZZp_=ct+(+E*El`KW zJxd~3uQR)`Ljg+*{M5Q>MvDKt>M`mV!S|-H{T(3PmhX7KVacF&U+$o1JL^IH9(J_t zRGIEebyo023ogQtGm=;Op1&oXEFtw6)TJ>J~dHYdSs6dGYG; znx;{x0`VC7K=SHDDYCT0+$rGmmV_U`QArOEIorL|tl8INpDEq_Dl7P;l*5&{mTvQ$dDhIasm1Za48422FoC6A1^@1Gv%|7=1>BcZd$h zfVVE&#rA(0a;}|;hSpOOwNK!DU)h@~b~Vu5bWPF=L@26|u}hdT0gCcuLrUP|_2$;{ zi0tg+5~X4I>SHssw2tFnKLvah9-=f>y*m=KZDX4%a@#;`w%FA`EWgXs#UZ?#G&y}KimU7lgL|l)!By{kosBBV9?O63S$wxSSI4LY@Ex8 zZcn*?!pW0JC z4oRpFYw=c$3W9{mk26<@W22MhUCXakYqz3KTc?T)ur-IBYue&GfXpeN*-@DWYt0$Q zYG&U{%OWIQi(HD_&;Q}&y=0T}0Z5Z2O>F=}d`&{rTlhoC_~r2Fk?`4$8wtlMS9cDh zrC@Kh<_b*M=aI!b@fu+h zZ=(E`xMn({^_==Td%nQ-23VBg{WpNNEfl_7Fv|vc<*SoWfS=V7x=TE;MPwYWVu%Y< zU(BcsoaXYsQKs_Ng)5AcAm0Ot?=(?GY*wglR2a?+`k`y*@^HReGw9+l?-VXg*#S1$LE;3n8XX3o43Q)S6j8(b4)j zeiJLJRO)o3V%ANG-8KPx4KrX|D;E$%`!R(efhBo)*Wz@<()7K>PDBLw`F)Sh zL<>jzj#b)9j;FuaV-PItSM^S=E}%?=Qv3Be?AJQ9b9uBBA%MQP(On9+R> z3l5GW_4~a5N-t2DfauUn#ddIq(6?XH@sACTH{Q`^M}j8@u7d0DD_YlW*-Duvp%J?F}) zQPZj0mKF@Bx~bJL?nsreCFUZOQ{~~eAo+tro>loIsZzA5c;@6UAk#>CdgZu5es%SL zbxY90+X6FfkpebA38lh)yNc0N7!fUNp4a7R zH0(lDegSrp&PcOh1?dy5Vs79ZybQwc?>@bFSM-&S`rkHu61OX~*{mYVkY6t|SX1q+ zc03-0Q8co1I>^xu)~37xY^{`3NEPx(4md43(=i`tzD2&{k&Fcw7m;*Mq=Pu#3lzaP z%alSk>#o{AW~7ZOC~y0Ns_~`ShW3a998tazs(--1xSU4^ICRuhCI1_X_z$Mf9oKM( z5?sX%_F66pTuFOc-;hv)UK|Z)GJb+-kqOy+`WMB3;g{2g^i70PYMW(m-55vb92v=nK^LypZ&^V z;$3ugp#NjNNi(Ndks7wK?mwT}oSh~KvUfq%56%oiNp9`R{xF(6*w_oVAXJH4McLPy zA&C~a@7)X|Gwfj2FexO(rzyfcwmlS9H7&5axae+TY<$n-iL8u_zQ2E+q`)lKpZE5s z3XQT?T{$x}!%jk=NQL z6WvMQWkOaujn-)azAR4fYaP@~`-z?_I)|!BUCB8X#%0dxNeHDYHu_11i^O>t*JkxXK$lbWDFS5LKs zQC4X%^^`;=sB+;Fjvb_^^(gWuPa>W28@1l~>(6<7!fcOLVEX#+2;2$D^bcBEdUYvF zM;+;6n~7p(`uhX_WPrJ)Y2h(lv<(O2Fp7loC>S80dJ1;>Rb(U-EhM;TJfp)1pjc|7 z_B&PVIbLse?i~B=A5`RjbgTWKM=@xk(ey_A&7=9qQ0MP6;g2XTPCTl#yx_p zH#`8vh1(<%)10JjYQ>a>>4+n-srtPz{Tq)$660AL<(FL+neFT{a?Rgh`2A!{$Z|;F zjJcCbhN$g>Cz~I*M9(4_hXlTF@Ii(qx8v+UTz|JD?S828)EyvJ!F31nRNKqcLoMSs z@gJ%$W&^e8ZTw!(DxShfPE@#k=?ozX=$=|v?!v>AE7rf&0~wM4&SmuL=5ei-MxmSj zth;uTw!yuXlZc>IKO$>N6Eit*e`%Y9rDx4+=j}{24c4t?HnfNCx7c)27>JT7vpT() z5w_lr4qKHr04%6wgg6roWCwE^{PtWPd5P?@Ciiye3x?6C(9owuh*w%u;MgVY*xdc% zJ=1h3u2S1}shwg%a1T^d>Gkjpi2sBtAegg(JU)L0yR5&xvrg zD+AkmRF_cC{xQg2&#oeDt zWX|O2t}c82ch*e~MUkKr%58#~N3`z{5Bv+w4Ju}}qe^gYLH0~^X}({aA}#M{e-w}d z^%8;A)tYMYNy?-pC@XCIY>orVp1gh4I4KHxEc6$Q{XB`^7!e`;WyI?3-g(;gku?m5wD zY+>u4bic}SfWgIk))Z)v$h&A@V4%Ce(?J$`+W$HRdM{&R=AnZUpcgA=QeTW{ix3b& zVMArMqDDKq|H{G*69|Guv9yW5^+|@f^A8#MfIZ}IHy(=p34aMR*K%;^Y8hUy`19`5 F{{_Z&=eYm? literal 10922 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 VHI8FE`_td8^;rKA{NdBr{{iyYs)+yq diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi index 167332b630e801f250afa762d67b6a0d215b0941..53b491cce761e851a19847dc4b2c34b3e9db5035 100644 GIT binary patch delta 10701 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 delta 10627 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 F{~ySfd^rFB diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index 535ae0d241395ccad554fb8b1791ca532dfc7295..1c596a6a0ffa99e22293a98f74e8c967a436cd5b 100644 GIT binary patch literal 18863 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 z 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 E09HFlnW5qI~8dkF?;!+`M#V-#}V!%?T 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 Date: Tue, 21 Jul 2020 02:30:32 -0400 Subject: [PATCH 109/122] a --- code/modules/vending/kinkmate.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/vending/kinkmate.dm b/code/modules/vending/kinkmate.dm index 3d94cb4ab4..df8a4e8a96 100644 --- a/code/modules/vending/kinkmate.dm +++ b/code/modules/vending/kinkmate.dm @@ -8,8 +8,8 @@ products = list( /obj/item/clothing/head/maid = 5, /obj/item/clothing/under/costume/maid = 5, - /obj/item/clothing/gloves/evening = 5, /obj/item/clothing/under/rank/civilian/janitor/maid = 5, + /obj/item/clothing/gloves/evening = 5, /obj/item/clothing/neck/petcollar = 5, /obj/item/clothing/neck/petcollar/choker = 5, /obj/item/clothing/neck/petcollar/leather = 5, From 401d7b14b5b4bf343f42f9bc42e6f09904238f5a Mon Sep 17 00:00:00 2001 From: Ludox Date: Tue, 21 Jul 2020 10:18:39 +0200 Subject: [PATCH 110/122] Get that shit off my screen Who tought this was a good idea for fuck sake --- strings/abductee_objectives.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/strings/abductee_objectives.txt b/strings/abductee_objectives.txt index 512fd2e60d..93fd946818 100644 --- a/strings/abductee_objectives.txt +++ b/strings/abductee_objectives.txt @@ -13,7 +13,6 @@ You're throwing a huge rager. Make it as awesome as possible so the whole crew c The clown is not funny. You can do better! Steal his audience and make the crew laugh! You burn with passion for music. Share your vision. If anyone hates it, beat them on the head with your instrument! Go have a good conversation with the singularity/tesla/supermatter crystal. Bonus points if it responds. -You are pregnant and soon due. Find a safe place to deliver your baby. Expand the station. So much lies undiscovered. Look deeper into the machinations of the universe. Climb the corporate ladder all the way to the top! From 4ac4d94c31de92075109f253a308770c73801c38 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 21 Jul 2020 12:06:08 -0500 Subject: [PATCH 111/122] Automatic changelog generation for PR #12852 [ci skip] --- html/changelogs/AutoChangeLog-pr-12852.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12852.yml diff --git a/html/changelogs/AutoChangeLog-pr-12852.yml b/html/changelogs/AutoChangeLog-pr-12852.yml new file mode 100644 index 0000000000..889a42f0bb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12852.yml @@ -0,0 +1,4 @@ +author: "Ludox" +delete-after: True +changes: + - rscdel: "You can no longer be brainwashed into giving birth to a fake baby" From 73925501ae62f64d979c42fdafb66a80c86739fb Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Tue, 21 Jul 2020 20:13:30 +0200 Subject: [PATCH 112/122] I will now proceed to scream internally Tabby boi bad --- code/datums/traits/negative.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 8f902fa088..95e02c5a94 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -452,8 +452,8 @@ GLOBAL_LIST_EMPTY(family_heirlooms) mob_trait = TRAIT_COLDBLOODED gain_text = "You feel cold-blooded." lose_text = "You feel more warm-blooded." - - /datum/quirk/monophobia + +/datum/quirk/monophobia name = "Monophobia" desc = "You will become increasingly stressed when not in company of others, triggering panic reactions ranging from sickness to heart attacks." value = -3 // Might change it to 4. From aea268548c87814a494db7b1c14f2401822f4be9 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 21 Jul 2020 19:54:42 +0100 Subject: [PATCH 113/122] some fixes --- code/datums/wounds/bones.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm index 230fc6758f..80d922cba3 100644 --- a/code/datums/wounds/bones.dm +++ b/code/datums/wounds/bones.dm @@ -444,7 +444,7 @@ else if(!taped) . += "Continue Alternative Treatment: Apply surgical tape directly to injured limb to begin bone regeneration. Note, this is both excruciatingly painful and slow.\n" else - . += "Note: Bone regeneration in effect. Bone is [round(regen_points_current/regen_points_needed)]% regenerated.\n" + . += "Note: Bone regeneration in effect. Bone is [round((regen_points_current*100)/regen_points_needed,0.1)]% regenerated.\n" if(limb.body_zone == BODY_ZONE_HEAD) . += "Cranial Trauma Detected: Patient will suffer random bouts of [severity == WOUND_SEVERITY_SEVERE ? "mild" : "severe"] brain traumas until bone is repaired." diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index d3cfa71d9a..4b7e27656b 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -174,6 +174,8 @@ if(IS_STAMCRIT(src)) to_chat(src, "You're too exhausted.") return + + var/random_turn = a_intent == INTENT_HARM //END OF CIT CHANGES var/obj/item/I = get_active_held_item() @@ -227,7 +229,7 @@ do_attack_animation(target, no_effect = 1) playsound(loc, 'sound/weapons/punchmiss.ogg', 50, 1, -1) newtonian_move(get_dir(target, src)) - thrown_thing.safe_throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed + power_throw, src, null, null, null, move_force) + thrown_thing.safe_throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed + power_throw, src, null, null, null, move_force, random_turn) /mob/living/carbon/restrained(ignore_grab) . = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE)) From 8b170ec840e4cddd2c50ac13677e869ecd02a7d2 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 22 Jul 2020 00:10:20 +0000 Subject: [PATCH 114/122] Automatic changelog compile [ci skip] --- html/changelog.html | 10 ++++++++++ html/changelogs/.all_changelog.yml | 6 ++++++ html/changelogs/AutoChangeLog-pr-12824.yml | 4 ---- html/changelogs/AutoChangeLog-pr-12852.yml | 4 ---- 4 files changed, 16 insertions(+), 8 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-12824.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12852.yml diff --git a/html/changelog.html b/html/changelog.html index 59426bb8d3..cc62c1b4c3 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,16 @@ -->

        +

        22 July 2020

        +

        Ludox updated:

        +
          +
        • You can no longer be brainwashed into giving birth to a fake baby
        • +
        +

        kappa-sama updated:

        +
          +
        • brainwashing disk has lost its cost buffs (3->5) and is role restricted once more (medical doctor/roboticist)
        • +
        +

        21 July 2020

        Arturlang updated:

          diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 9c53b8387d..a1b46b13b9 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -26461,3 +26461,9 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: new fried component used for frying objects - bugfix: various frying bugs fixed such as being able to unfry items and frying turfs with cold cooking oil +2020-07-22: + Ludox: + - rscdel: You can no longer be brainwashed into giving birth to a fake baby + kappa-sama: + - balance: brainwashing disk has lost its cost buffs (3->5) and is role restricted + once more (medical doctor/roboticist) diff --git a/html/changelogs/AutoChangeLog-pr-12824.yml b/html/changelogs/AutoChangeLog-pr-12824.yml deleted file mode 100644 index 5723117238..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12824.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kappa-sama" -delete-after: True -changes: - - balance: "brainwashing disk has lost its cost buffs (3->5) and is role restricted once more (medical doctor/roboticist)" diff --git a/html/changelogs/AutoChangeLog-pr-12852.yml b/html/changelogs/AutoChangeLog-pr-12852.yml deleted file mode 100644 index 889a42f0bb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12852.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ludox" -delete-after: True -changes: - - rscdel: "You can no longer be brainwashed into giving birth to a fake baby" From 7c53135650e32d3e7e1abc4c2e3e4daae873c9da Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 21 Jul 2020 21:20:56 -0500 Subject: [PATCH 115/122] Automatic changelog generation for PR #12851 [ci skip] --- html/changelogs/AutoChangeLog-pr-12851.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12851.yml diff --git a/html/changelogs/AutoChangeLog-pr-12851.yml b/html/changelogs/AutoChangeLog-pr-12851.yml new file mode 100644 index 0000000000..8b5cb06ec2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12851.yml @@ -0,0 +1,4 @@ +author: "zeroisthebiggay" +delete-after: True +changes: + - rscadd: "fetish content" From dff4e13ddde62ce939fba39f9c97eec01bdad00d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 22 Jul 2020 04:30:35 -0500 Subject: [PATCH 116/122] Automatic changelog generation for PR #12847 [ci skip] --- html/changelogs/AutoChangeLog-pr-12847.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12847.yml diff --git a/html/changelogs/AutoChangeLog-pr-12847.yml b/html/changelogs/AutoChangeLog-pr-12847.yml new file mode 100644 index 0000000000..2c8f0f1381 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12847.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - tweak: "Slight optimization in chat code." From f9e7d9dd6fcbfb034d6ecce9feeaee9c92fa52c4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 22 Jul 2020 04:31:25 -0500 Subject: [PATCH 117/122] Automatic changelog generation for PR #12835 [ci skip] --- html/changelogs/AutoChangeLog-pr-12835.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12835.yml diff --git a/html/changelogs/AutoChangeLog-pr-12835.yml b/html/changelogs/AutoChangeLog-pr-12835.yml new file mode 100644 index 0000000000..7532264f47 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12835.yml @@ -0,0 +1,4 @@ +author: "kappa-sama" +delete-after: True +changes: + - bugfix: "tendril chests being empty" From 0ccbe0b7939feacce75027e24db1133b94643ead Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Wed, 22 Jul 2020 14:49:22 +0100 Subject: [PATCH 118/122] it works --- code/modules/surgery/bodyparts/parts.dm | 90 ++++++++++--------------- 1 file changed, 37 insertions(+), 53 deletions(-) diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index 2a72adeb5f..a18b31e4c1 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -1,4 +1,3 @@ - /obj/item/bodypart/chest name = BODY_ZONE_CHEST desc = "It's impolite to stare at a person's chest." @@ -11,8 +10,6 @@ stam_damage_coeff = 1 max_stamina_damage = 200 var/obj/item/cavity_item - specific_locations = list("upper chest", "lower abdomen", "midsection", "collarbone", "lower back") - wound_resistance = 10 /obj/item/bodypart/chest/can_dismember(obj/item/I) if(!((owner.stat == DEAD) || owner.InFullCritical())) @@ -20,12 +17,13 @@ return ..() /obj/item/bodypart/chest/Destroy() - QDEL_NULL(cavity_item) + if(cavity_item) + qdel(cavity_item) return ..() -/obj/item/bodypart/chest/drop_organs(mob/user, violent_removal) +/obj/item/bodypart/chest/drop_organs(mob/user) if(cavity_item) - cavity_item.forceMove(drop_location()) + cavity_item.forceMove(user.loc) cavity_item = null ..() @@ -33,7 +31,6 @@ icon = 'icons/mob/animal_parts.dmi' icon_state = "default_monkey_chest" animal_origin = MONKEY_BODYPART - wound_resistance = -10 /obj/item/bodypart/chest/alien icon = 'icons/mob/animal_parts.dmi' @@ -66,12 +63,12 @@ max_stamina_damage = 50 body_zone = BODY_ZONE_L_ARM body_part = ARM_LEFT + aux_icons = list(BODY_ZONE_PRECISE_L_HAND = HANDS_PART_LAYER, "l_hand_behind" = BODY_BEHIND_LAYER) body_damage_coeff = 0.75 held_index = 1 px_x = -6 px_y = 0 - specific_locations = list("outer left forearm", "inner left wrist", "left elbow", "left bicep", "left shoulder") - aux_icons = list(BODY_ZONE_PRECISE_L_HAND = HANDS_PART_LAYER, "l_hand_behind" = BODY_BEHIND_LAYER) + stam_heal_tick = STAM_RECOVERY_LIMB /obj/item/bodypart/l_arm/is_disabled() if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_ARM)) @@ -82,18 +79,15 @@ . = ..() if(!.) return - if(disabled == BODYPART_DISABLED_DAMAGE) - if(owner.stat < UNCONSCIOUS) - owner.emote("scream") - if(owner.stat < DEAD) - to_chat(owner, "Your [name] is too damaged to function!") - if(held_index) - owner.dropItemToGround(owner.get_item_for_held_index(held_index)) - else if(disabled == BODYPART_DISABLED_PARALYSIS) - if(owner.stat < DEAD) - to_chat(owner, "You can't feel your [name]!") - if(held_index) - owner.dropItemToGround(owner.get_item_for_held_index(held_index)) + if(owner.stat < UNCONSCIOUS) + switch(disabled) + if(BODYPART_DISABLED_DAMAGE) + owner.emote("scream") + to_chat(owner, "Your [name] is too damaged to function!") + if(BODYPART_DISABLED_PARALYSIS) + to_chat(owner, "You can't feel your [name]!") + if(held_index) + owner.dropItemToGround(owner.get_item_for_held_index(held_index)) if(owner.hud_used) var/obj/screen/inventory/hand/L = owner.hud_used.hand_slots["[held_index]"] if(L) @@ -103,7 +97,6 @@ icon = 'icons/mob/animal_parts.dmi' icon_state = "default_monkey_l_arm" animal_origin = MONKEY_BODYPART - wound_resistance = -10 px_x = -5 px_y = -3 @@ -130,13 +123,13 @@ max_damage = 50 body_zone = BODY_ZONE_R_ARM body_part = ARM_RIGHT + aux_icons = list(BODY_ZONE_PRECISE_R_HAND = HANDS_PART_LAYER, "r_hand_behind" = BODY_BEHIND_LAYER) body_damage_coeff = 0.75 held_index = 2 px_x = 6 px_y = 0 + stam_heal_tick = STAM_RECOVERY_LIMB max_stamina_damage = 50 - specific_locations = list("outer right forearm", "inner right wrist", "right elbow", "right bicep", "right shoulder") - aux_icons = list(BODY_ZONE_PRECISE_R_HAND = HANDS_PART_LAYER, "r_hand_behind" = BODY_BEHIND_LAYER) /obj/item/bodypart/r_arm/is_disabled() if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_ARM)) @@ -147,28 +140,25 @@ . = ..() if(!.) return - if(disabled == BODYPART_DISABLED_DAMAGE) - if(owner.stat < UNCONSCIOUS) - owner.emote("scream") - if(owner.stat < DEAD) - to_chat(owner, "Your [name] is too damaged to function!") - if(held_index) - owner.dropItemToGround(owner.get_item_for_held_index(held_index)) - else if(disabled == BODYPART_DISABLED_PARALYSIS) - if(owner.stat < DEAD) - to_chat(owner, "You can't feel your [name]!") - if(held_index) - owner.dropItemToGround(owner.get_item_for_held_index(held_index)) + if(owner.stat < UNCONSCIOUS) + switch(disabled) + if(BODYPART_DISABLED_DAMAGE) + owner.emote("scream") + to_chat(owner, "Your [name] is too damaged to function!") + if(BODYPART_DISABLED_PARALYSIS) + to_chat(owner, "You can't feel your [name]!") + if(held_index) + owner.dropItemToGround(owner.get_item_for_held_index(held_index)) if(owner.hud_used) var/obj/screen/inventory/hand/R = owner.hud_used.hand_slots["[held_index]"] if(R) R.update_icon() + /obj/item/bodypart/r_arm/monkey icon = 'icons/mob/animal_parts.dmi' icon_state = "default_monkey_r_arm" animal_origin = MONKEY_BODYPART - wound_resistance = -10 px_x = 5 px_y = -3 @@ -198,8 +188,8 @@ body_damage_coeff = 0.75 px_x = -2 px_y = 12 + stam_heal_tick = STAM_RECOVERY_LIMB max_stamina_damage = 50 - specific_locations = list("inner left thigh", "outer left calf", "outer left hip", " left kneecap", "lower left shin") /obj/item/bodypart/l_leg/is_disabled() if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_LEG)) @@ -208,15 +198,13 @@ /obj/item/bodypart/l_leg/set_disabled(new_disabled) . = ..() - if(!.) + if(!. || owner.stat >= UNCONSCIOUS) return - if(disabled == BODYPART_DISABLED_DAMAGE) - if(owner.stat < UNCONSCIOUS) + switch(disabled) + if(BODYPART_DISABLED_DAMAGE) owner.emote("scream") - if(owner.stat < DEAD) to_chat(owner, "Your [name] is too damaged to function!") - else if(disabled == BODYPART_DISABLED_PARALYSIS) - if(owner.stat < DEAD) + if(BODYPART_DISABLED_PARALYSIS) to_chat(owner, "You can't feel your [name]!") /obj/item/bodypart/l_leg/digitigrade @@ -227,7 +215,6 @@ icon = 'icons/mob/animal_parts.dmi' icon_state = "default_monkey_l_leg" animal_origin = MONKEY_BODYPART - wound_resistance = -10 px_y = 4 /obj/item/bodypart/l_leg/alien @@ -259,7 +246,7 @@ px_x = 2 px_y = 12 max_stamina_damage = 50 - specific_locations = list("inner right thigh", "outer right calf", "outer right hip", "right kneecap", "lower right shin") + stam_heal_tick = STAM_RECOVERY_LIMB /obj/item/bodypart/r_leg/is_disabled() if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_LEG)) @@ -268,15 +255,13 @@ /obj/item/bodypart/r_leg/set_disabled(new_disabled) . = ..() - if(!.) + if(!. || owner.stat >= UNCONSCIOUS) return - if(disabled == BODYPART_DISABLED_DAMAGE) - if(owner.stat < UNCONSCIOUS) + switch(disabled) + if(BODYPART_DISABLED_DAMAGE) owner.emote("scream") - if(owner.stat < DEAD) to_chat(owner, "Your [name] is too damaged to function!") - else if(disabled == BODYPART_DISABLED_PARALYSIS) - if(owner.stat < DEAD) + if(BODYPART_DISABLED_PARALYSIS) to_chat(owner, "You can't feel your [name]!") /obj/item/bodypart/r_leg/digitigrade @@ -287,7 +272,6 @@ icon = 'icons/mob/animal_parts.dmi' icon_state = "default_monkey_r_leg" animal_origin = MONKEY_BODYPART - wound_resistance = -10 px_y = 4 /obj/item/bodypart/r_leg/alien From cf913032909f8086546e76a193524859d49f452f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 22 Jul 2020 13:41:52 -0500 Subject: [PATCH 119/122] Automatic changelog generation for PR #12855 [ci skip] --- html/changelogs/AutoChangeLog-pr-12855.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12855.yml diff --git a/html/changelogs/AutoChangeLog-pr-12855.yml b/html/changelogs/AutoChangeLog-pr-12855.yml new file mode 100644 index 0000000000..7c91444962 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12855.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - bugfix: "Traits are no longer fucked" From ed25929fec98010ee38d394845f6d932d716a39d Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 23 Jul 2020 00:10:46 +0000 Subject: [PATCH 120/122] Automatic changelog compile [ci skip] --- html/changelog.html | 18 ++++++++++++++++++ html/changelogs/.all_changelog.yml | 9 +++++++++ html/changelogs/AutoChangeLog-pr-12835.yml | 4 ---- html/changelogs/AutoChangeLog-pr-12847.yml | 4 ---- html/changelogs/AutoChangeLog-pr-12851.yml | 4 ---- html/changelogs/AutoChangeLog-pr-12855.yml | 4 ---- 6 files changed, 27 insertions(+), 16 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-12835.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12847.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12851.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12855.yml diff --git a/html/changelog.html b/html/changelog.html index cc62c1b4c3..d0731d740c 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,24 @@ -->
          +

          23 July 2020

          +

          DeltaFire15 updated:

          +
            +
          • Traits are no longer fucked
          • +
          +

          Putnam3145 updated:

          +
            +
          • Slight optimization in chat code.
          • +
          +

          kappa-sama updated:

          +
            +
          • tendril chests being empty
          • +
          +

          zeroisthebiggay updated:

          +
            +
          • fetish content
          • +
          +

          22 July 2020

          Ludox updated:

            diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index a1b46b13b9..45d8e6ebe5 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -26467,3 +26467,12 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. kappa-sama: - balance: brainwashing disk has lost its cost buffs (3->5) and is role restricted once more (medical doctor/roboticist) +2020-07-23: + DeltaFire15: + - bugfix: Traits are no longer fucked + Putnam3145: + - tweak: Slight optimization in chat code. + kappa-sama: + - bugfix: tendril chests being empty + zeroisthebiggay: + - rscadd: fetish content diff --git a/html/changelogs/AutoChangeLog-pr-12835.yml b/html/changelogs/AutoChangeLog-pr-12835.yml deleted file mode 100644 index 7532264f47..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12835.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kappa-sama" -delete-after: True -changes: - - bugfix: "tendril chests being empty" diff --git a/html/changelogs/AutoChangeLog-pr-12847.yml b/html/changelogs/AutoChangeLog-pr-12847.yml deleted file mode 100644 index 2c8f0f1381..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12847.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - tweak: "Slight optimization in chat code." diff --git a/html/changelogs/AutoChangeLog-pr-12851.yml b/html/changelogs/AutoChangeLog-pr-12851.yml deleted file mode 100644 index 8b5cb06ec2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12851.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "zeroisthebiggay" -delete-after: True -changes: - - rscadd: "fetish content" diff --git a/html/changelogs/AutoChangeLog-pr-12855.yml b/html/changelogs/AutoChangeLog-pr-12855.yml deleted file mode 100644 index 7c91444962..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12855.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DeltaFire15" -delete-after: True -changes: - - bugfix: "Traits are no longer fucked" From f5ac0b5762fb9cd4ce74694e9163d1675800391e Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 23 Jul 2020 18:10:46 +0100 Subject: [PATCH 121/122] some fixes --- code/datums/wounds/cuts.dm | 3 +++ code/modules/antagonists/slaughter/slaughter.dm | 4 ++-- .../mob/living/carbon/human/species_types/furrypeople.dm | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/datums/wounds/cuts.dm b/code/datums/wounds/cuts.dm index 578c8b9ddf..0ab3bbd5f8 100644 --- a/code/datums/wounds/cuts.dm +++ b/code/datums/wounds/cuts.dm @@ -132,6 +132,9 @@ if(!iscatperson(user)) return FALSE + if(!(user.client?.prefs.vore_flags & LICKABLE)) + return FALSE + lick_wounds(user) return TRUE diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index 0c51c65a6f..35a674fb0e 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -34,8 +34,8 @@ healable = 0 environment_smash = ENVIRONMENT_SMASH_STRUCTURES obj_damage = 50 - melee_damage_lower = 15 // reduced from 30 to 15 with wounds since they get big buffs to slicing wounds - melee_damage_upper = 15 + melee_damage_lower = 22.5 // reduced from 30 to 22.5 with wounds since they get big buffs to slicing wounds + melee_damage_upper = 22.5 wound_bonus = -10 bare_wound_bonus = 0 sharpness = TRUE diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 9520d77015..203f8fa289 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -55,7 +55,7 @@ say_mod = "hisses" default_color = "00FF00" icon_limbs = DEFAULT_BODYPART_ICON_CITADEL - species_traits = list(MUTCOLORS,EYECOLOR,LIPS) + species_traits = list(MUTCOLORS,EYECOLOR,LIPS,CAN_SCAR) mutant_bodyparts = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade") attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' From 678a1d0a49fd79adca18be62c2c2f632e861d18c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 23 Jul 2020 12:25:29 -0500 Subject: [PATCH 122/122] Automatic changelog generation for PR #12816 [ci skip] --- html/changelogs/AutoChangeLog-pr-12816.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12816.yml diff --git a/html/changelogs/AutoChangeLog-pr-12816.yml b/html/changelogs/AutoChangeLog-pr-12816.yml new file mode 100644 index 0000000000..a984be4d5f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12816.yml @@ -0,0 +1,4 @@ +author: "timothyteakettle" +delete-after: True +changes: + - rscadd: "due to recent innovative research in the medical field, you now have bones"