From 50b508f2d66013247c8cf397a025f12ee6aabdb4 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Tue, 7 Mar 2017 22:34:42 -0600 Subject: [PATCH 1/8] Adds Morpheus skull head --- code/modules/organs/robolimbs.dm | 7 +++++++ .../cyberlimbs/morpheus/morpheus_alt2.dmi | Bin 0 -> 438 bytes 2 files changed, 7 insertions(+) create mode 100644 icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt2.dmi diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index f46326a53e..a1512b11c6 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -112,6 +112,13 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ unavailable_to_build = 1 parts = list(BP_HEAD) +/datum/robolimb/morpheus_alt2 + company = "Morpheus - Skeleton Crew" + desc = "This limb is simple and functional; it's basically just a case for a brain." + icon = 'icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt2.dmi' + unavailable_to_build = 1 + parts = list(BP_HEAD) + /datum/robolimb/veymed company = "Vey-Med" desc = "This high quality limb is nearly indistinguishable from an organic one." diff --git a/icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt2.dmi b/icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt2.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6bee009356f1521a43b9f62870b1f2202091c223 GIT binary patch literal 438 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeE3?v1%WpM*3=>VS)*8>L*NJ&ZA+1UXF($dn@ z)z#hI-TnRjf#RAxPOLyt#*!evU)e_1!5cyiE*d|0q;uX!^CUx2Pwx&3;~?Y9#$F0@9!)wjDMTSy zQ`yu|)h@iV+gNq;3W+7%-NtJ*49!K4n7IT`YxADDscH3m?i*DMNg1jsjt3WC1X_L0 z)5S3)qV?@`L%u@>0xaiQe%;`*-RW{gio!YFGWAU;_`p~Dg7~6Rh zRJU>S9qC|x+`;^?S$fIJ?Zq>W6w0K>Z;(H=&tSD-{%}JX2|<9wlt9Fz;|E%1);_f8+x&@DI7I5b UTF9ajpwAdQUHx3vIVCg!0Aa(no&W#< literal 0 HcmV?d00001 From 0465613465bbae2dee183d6538fe5d785d01a1b2 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Wed, 8 Mar 2017 12:36:43 -0600 Subject: [PATCH 2/8] Changes tank sprite for Vox --- .../objects/items/weapons/tanks/tank_types.dm | 3 ++- icons/obj/tank.dmi | Bin 3325 -> 3322 bytes 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 6c2b6aa885..d9d19ca4d5 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -103,7 +103,8 @@ /obj/item/weapon/tank/vox //Can't be a child of phoron or the gas amount gets screwey. name = "phoron tank" desc = "Contains dangerous phoron. Do not inhale. Warning: extremely flammable." - icon_state = "oxygen_fr" + icon_state = "phoron_vox" + item_state = "oxygen_fr" gauge_icon = null flags = CONDUCT distribute_pressure = ONE_ATMOSPHERE*O2STANDARD diff --git a/icons/obj/tank.dmi b/icons/obj/tank.dmi index 6c4d65b76e110f02603d11d1911112bab98ac13d..33cde91a1dd73b42ac12a8e29fe4bc639be568e2 100644 GIT binary patch delta 396 zcmV;70dxNS8TuKpL;`V=-0C=3Omced=Fbsyz@D!-M(h1tK z+b&b9sfYCyPyiRQLV^;vYu|pfAT(`7iJ`Y7`hHvaZ5-y_`}SkE_cot9_Y6vNDZDpt z{Svs&H_xzWHmjxU6u|QW+l@ws&@5;2a?L@^Tqom7HwU5X929@6pk4PE6QHpGXr zWKgo}?bv^yJ4>EfC%M5knIb>>FHTCzeeSePuBHF0#S>X2G1D5Vq@;A4;HadL=OW`N zL#bk9;usM5&|H6@zz>5V`I4A!Mda5+J|gn31imi}#p7Ny!RS5)#qC~1vAh>ieE&P| zM%mM8pW#v$YLr=>c9dtGc8Ybfc|A+X24>&TEPD`dYM|S7e-pFB133xRw8D=7 delta 396 zcmV;70dxNP8T}csL;`V=-0C=3Omd|d3Fbu}e@D!-M(uw}t zZI`Ll)WiA;D1ZxDAx4SYt#3bC5Sq54#B{eL`h9lzY?4fa*X`SGA8g)t{u#89sDhVZ z^%VKur_88mCd-BI6(IA1+KC}S&4VV6wnaQ#=Dl$`Im(Jr|b;g3#Fuu5WK3{*+U={6-v zqm`E`lc^xoF$sTljF|k~UZ5zPM?>-jGu@KOubBLr$v-przAzk*d(i_%_c1tb_actv zy@=!c@AGbyJ)QPHT$@~qQ7VjVV@Xo+Ir>>E1E?!yxe> quD+HY!luD?zqvgwz5!|`jcSR>igy422{1`SK~#90?VYo}13U>Z^Trtf From 9373c0d00dafdb18d8aa2b2e3e74a441a8a5841b Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Thu, 9 Mar 2017 16:29:23 -0500 Subject: [PATCH 3/8] Give internal cell it's own icon Was a little weird to reuse the supercell... there are already WAY TOO MANY "not an actual powercell" powercells. So this one is just repainted blue and joins all the other prosthetic organs in surgery.dmi. The icon line can just be removed because the parent points to this file. --- code/modules/organs/subtypes/machine.dm | 1 - icons/obj/surgery.dmi | Bin 16969 -> 17917 bytes 2 files changed, 1 deletion(-) diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm index df692c4a97..2b6bceb9ae 100644 --- a/code/modules/organs/subtypes/machine.dm +++ b/code/modules/organs/subtypes/machine.dm @@ -1,7 +1,6 @@ /obj/item/organ/internal/cell name = "microbattery" desc = "A small, powerful cell for use in fully prosthetic bodies." - icon = 'icons/obj/power.dmi' icon_state = "scell" organ_tag = "cell" parent_organ = BP_TORSO diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index f8aede48f2cccf642073691dd81fab99b5d4e798..b2ff3108ea68eccf72116145986e1c713a0c12c8 100644 GIT binary patch literal 17917 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 Date: Thu, 9 Mar 2017 19:53:03 -0500 Subject: [PATCH 4/8] New Event: Canister Leak Somewhere on the station, a gas canister is faulty and ruptures, releasing its contents (no explosion). * Added as an event_manger event. This version is nice on low severity and picks a canister with nobody nearby. * Also added as a gamemaster event. * Added helper method to check area occupancy. --- code/_helpers/game.dm | 12 ++++++++ code/modules/events/canister_leak.dm | 30 +++++++++++++++++++ .../gamemaster/actions/canister_leak.dm | 24 +++++++++++++++ polaris.dme | 2 ++ 4 files changed, 68 insertions(+) create mode 100644 code/modules/events/canister_leak.dm create mode 100644 code/modules/gamemaster/actions/canister_leak.dm diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index 6f6f4f9f0a..1531a67d5b 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -43,6 +43,18 @@ if (isarea(A)) return A + +/** Checks if any living humans are in a given area. */ +/proc/area_is_occupied(var/area/myarea) + // Testing suggests looping over human_mob_list is quicker than looping over area contents + for(var/mob/living/carbon/human/H in human_mob_list) + if(H.stat >= DEAD) //Conditions for exclusion here, like if disconnected people start blocking it. + continue + var/area/A = get_area(H) + if(A == myarea) //The loc of a turf is the area it is in. + return 1 + return 0 + /proc/in_range(source, user) if(get_dist(source, user) <= 1) return 1 diff --git a/code/modules/events/canister_leak.dm b/code/modules/events/canister_leak.dm new file mode 100644 index 0000000000..956d8a0940 --- /dev/null +++ b/code/modules/events/canister_leak.dm @@ -0,0 +1,30 @@ +// +// This event chooses a random canister on player levels and breaks it, releasing its contents! +// On severity EVENT_LEVEL_MUNDANE or below it checks to make sure nobody is in the area, otherwise... good luck. +// + +/datum/event/canister_leak/start() + // List of all non-destroyed canisters on station levels + var/list/all_canisters = list() + for(var/obj/machinery/portable_atmospherics/canister/C in machines) + if(!C.destroyed && (C.z in using_map.station_levels)) + all_canisters += C + + for(var/i in 1 to 10) + var/obj/machinery/portable_atmospherics/canister/C = pick(all_canisters) + if(severity <= EVENT_LEVEL_MUNDANE && area_is_occupied(get_area(C))) + log_debug("canister_leak event: Rejecting canister [C] ([C.x],[C.y],[C.z]) because area is occupied") + continue + // Okay lets break it + break_canister(C) + return + + // If we got to here we failed to find it + log_debug("canister_leak event: Giving up after too many failures to pick target canister") + kill() + return + +/datum/event/canister_leak/proc/break_canister(var/obj/machinery/portable_atmospherics/canister/C) + log_debug("canister_leak event: Canister [C] ([C.x],[C.y],[C.z]) destroyed.") + C.health = 0 + C.healthcheck() diff --git a/code/modules/gamemaster/actions/canister_leak.dm b/code/modules/gamemaster/actions/canister_leak.dm new file mode 100644 index 0000000000..ed55c0cded --- /dev/null +++ b/code/modules/gamemaster/actions/canister_leak.dm @@ -0,0 +1,24 @@ +// +// This event chooses a random canister on player levels and breaks it, releasing its contents! +// + +/datum/gm_action/canister_leak + name = "Canister Leak" + departments = list(ROLE_ENGINEERING) + chaotic = 20 + +/datum/gm_action/canister_leak/get_weight() + return metric.count_people_in_department(ROLE_ENGINEERING) * 30 + +/datum/gm_action/canister_leak/start() + ..() + // List of all non-destroyed canisters on station levels + var/list/all_canisters = list() + for(var/obj/machinery/portable_atmospherics/canister/C in machines) + if(!C.destroyed && (C.z in using_map.station_levels)) + all_canisters += C + var/obj/machinery/portable_atmospherics/canister/C = pick(all_canisters) + log_debug("canister_leak event: Canister [C] ([C.x],[C.y],[C.z]) destroyed.") + C.health = 0 + C.healthcheck() + return diff --git a/polaris.dme b/polaris.dme index f7bfd240ce..3b9bd4925e 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1309,6 +1309,7 @@ #include "code\modules\events\blob.dm" #include "code\modules\events\brand_intelligence.dm" #include "code\modules\events\camera_damage.dm" +#include "code\modules\events\canister_leak.dm" #include "code\modules\events\carp_migration.dm" #include "code\modules\events\comms_blackout.dm" #include "code\modules\events\communications_blackout.dm" @@ -1365,6 +1366,7 @@ #include "code\modules\gamemaster\game_master.dm" #include "code\modules\gamemaster\helpers.dm" #include "code\modules\gamemaster\actions\action.dm" +#include "code\modules\gamemaster\actions\canister_leak.dm" #include "code\modules\gamemaster\actions\carp_migration.dm" #include "code\modules\gamemaster\actions\comms_blackout.dm" #include "code\modules\gamemaster\actions\dust.dm" From baf8e2d1434146a00c3db82cabdd555d16f27f88 Mon Sep 17 00:00:00 2001 From: Leshana Date: Fri, 10 Mar 2017 21:33:20 -0500 Subject: [PATCH 5/8] Fix handcuff hud icons appearing on the left and right hand inventory hud slots when handcuffed. We define the inventory screen objects for hands to be special in that apply overlays to themselves for handcuffed. By putting that logic on the screen object itself, we allow it to be expanded to other cases besides handcuffs in the future without conflict. --- code/_onclick/hud/human.dm | 6 ++++-- code/_onclick/hud/screen_objects.dm | 18 ++++++++++++++++++ .../mob/living/carbon/human/update_icons.dm | 7 +++++++ icons/mob/screen_gen.dmi | Bin 182 -> 466 bytes 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 709117de8c..57e1e4bb6a 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -158,7 +158,8 @@ using.alpha = ui_alpha src.adding += using - inv_box = new /obj/screen/inventory() + inv_box = new /obj/screen/inventory/hand() + inv_box.hud = src inv_box.name = "r_hand" inv_box.icon = ui_style inv_box.icon_state = "r_hand_inactive" @@ -173,7 +174,8 @@ src.r_hand_hud_object = inv_box src.adding += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /obj/screen/inventory/hand() + inv_box.hud = src inv_box.name = "l_hand" inv_box.icon = ui_style inv_box.icon_state = "l_hand_inactive" diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index d899f62049..3f6758c6ad 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -12,6 +12,7 @@ layer = 20.0 unacidable = 1 var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. + var/datum/hud/hud = null // A reference to the owner HUD, if any. /obj/screen/Destroy() master = null @@ -507,3 +508,20 @@ usr.update_inv_l_hand(0) usr.update_inv_r_hand(0) return 1 + +// Hand slots are special to handle the handcuffs overlay +/obj/screen/inventory/hand + var/image/handcuff_overlay + +/obj/screen/inventory/hand/update_icon() + ..() + if(!hud) + return + if(!handcuff_overlay) + var/state = (hud.l_hand_hud_object == src) ? "l_hand_hud_handcuffs" : "r_hand_hud_handcuffs" + handcuff_overlay = image("icon"='icons/mob/screen_gen.dmi', "icon_state"=state) + overlays.Cut() + if(hud.mymob && iscarbon(hud.mymob)) + var/mob/living/carbon/C = hud.mymob + if(C.handcuffed) + overlays |= handcuff_overlay diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 6f586d764e..2a29d2d1d9 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -895,6 +895,11 @@ var/global/list/damage_icon_parts = list() if(hud_used) hud_used.hidden_inventory_update() //Updates the screenloc of the items on the 'other' inventory bar +//update whether handcuffs appears on our hud. +/mob/living/carbon/proc/update_hud_handcuffed() + if(hud_used && hud_used.l_hand_hud_object && hud_used.r_hand_hud_object) + hud_used.l_hand_hud_object.update_icon() + hud_used.r_hand_hud_object.update_icon() /mob/living/carbon/human/update_inv_handcuffed(var/update_icons=1) if(handcuffed) @@ -913,6 +918,8 @@ var/global/list/damage_icon_parts = list() else overlays_standing[HANDCUFF_LAYER] = null + + update_hud_handcuffed() if(update_icons) update_icons() /mob/living/carbon/human/update_inv_legcuffed(var/update_icons=1) diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index cf74d73796c8c6121c0818fdac74e4a7f0ab9a5f..2071c634d1327ea703d95f89ab82c0c31e0a2aa8 100644 GIT binary patch delta 427 zcmV;c0aX6B0n!71iBL{Q4GJ0x0000DNk~Le0000$0000$2m=5B0G+pi>;M1&Gf+%a zMF0Q*G&D3=SXeJFFF`>;E-o${92`nYN=;2oPft&1XlO%2LsnK+Zfjj$Z(w8ic$+`hyY`+nP=d$P#W93qW^#hW9UyN31LIR^ R|8+nXgQu&X%Q~loCICDTAFlua From 14a667abec30363539529ab5c81f5e068de8a698 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Sat, 11 Mar 2017 21:58:51 +0000 Subject: [PATCH 6/8] Adds more types of tea --- .../Chemistry-Reagents-Food-Drinks.dm | 66 +++++++++++++++++++ code/modules/reagents/Chemistry-Recipes.dm | 37 ++++++++++- .../reagents/dispenser/dispenser2_energy.dm | 3 +- 3 files changed, 104 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 5cff9231a1..72e938651c 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -699,6 +699,71 @@ cup_name = "cup of iced tea" cup_desc = "No relation to a certain rap artist/ actor." +/datum/reagent/drink/tea/minttea + name = "Mint Tea" + id = "minttea" + description = "A tasty mixture of mint and tea. It's apparently good for you!" + color = "#A8442C" + taste_description = "black tea with tones of mint" + + glass_name = "mint tea" + glass_desc = "A tasty mixture of mint and tea. It's apparently good for you!" + + cup_name = "cup of mint tea" + cup_desc = "A tasty mixture of mint and tea. It's apparently good for you!" + +/datum/reagent/drink/tea/lemontea + name = "Lemon Tea" + id = "lemontea" + description = "A tasty mixture of lemon and tea. It's apparently good for you!" + color = "#FC6A00" + taste_description = "black tea with tones of lemon" + + glass_name = "lemon tea" + glass_desc = "A tasty mixture of lemon and tea. It's apparently good for you!" + + cup_name = "cup of lemon tea" + cup_desc = "A tasty mixture of lemon and tea. It's apparently good for you!" + +/datum/reagent/drink/tea/limetea + name = "Lime Tea" + id = "limetea" + description = "A tasty mixture of lime and tea. It's apparently good for you!" + color = "#DE4300" + taste_description = "black tea with tones of lime" + + glass_name = "lime tea" + glass_desc = "A tasty mixture of lime and tea. It's apparently good for you!" + + cup_name = "cup of berry tea" + cup_desc = "A tasty mixture of lime and tea. It's apparently good for you!" + +/datum/reagent/drink/tea/orangetea + name = "Orange Tea" + id = "orangetea" + description = "A tasty mixture of orange and tea. It's apparently good for you!" + color = "#FB4F06" + taste_description = "black tea with tones of orange" + + glass_name = "orange tea" + glass_desc = "A tasty mixture of orange and tea. It's apparently good for you!" + + cup_name = "cup of orange tea" + cup_desc = "A tasty mixture of orange and tea. It's apparently good for you!" + +/datum/reagent/drink/tea/berrytea + name = "Berry Tea" + id = "berrytea" + description = "A tasty mixture of berries and tea. It's apparently good for you!" + color = "#A60735" + taste_description = "black tea with tones of berries" + + glass_name = "berry tea" + glass_desc = "A tasty mixture of berries and tea. It's apparently good for you!" + + cup_name = "cup of berry tea" + cup_desc = "A tasty mixture of berries and tea. It's apparently good for you!" + /datum/reagent/drink/coffee name = "Coffee" id = "coffee" @@ -2165,3 +2230,4 @@ glass_name = "special blend whiskey" glass_desc = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything." + diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 4d7d13e5b3..d63cacfb94 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -1782,4 +1782,39 @@ id = "arnold_palmer" result = "arnold_palmer" required_reagents = list("icetea" = 1, "lemonade" = 1) - result_amount = 2 \ No newline at end of file + result_amount = 2 + +/datum/chemical_reaction/minttea + name = "Mint Tea" + id = "minttea" + result = "minttea" + required_reagents = list("tea" = 5, "mint" = 1) + result_amount = 6 + +/datum/chemical_reaction/lemontea + name = "Lemon Tea" + id = "lemontea" + result = "lemontea" + required_reagents = list("tea" = 5, "lemonjuice" = 1) + result_amount = 6 + +/datum/chemical_reaction/limetea + name = "Lime Tea" + id = "limetea" + result = "limetea" + required_reagents = list("tea" = 5, "limejuice" = 1) + result_amount = 6 + +/datum/chemical_reaction/limetea + name = "Orange Tea" + id = "orangetea" + result = "orangetea" + required_reagents = list("tea" = 5, "orangejuice" = 1) + result_amount = 6 + +/datum/chemical_reaction/berrytea + name = "Berry Tea" + id = "berrytea" + result = "berrytea" + required_reagents = list("tea" = 5, "berryjuice" = 1) + result_amount = 6 \ No newline at end of file diff --git a/code/modules/reagents/dispenser/dispenser2_energy.dm b/code/modules/reagents/dispenser/dispenser2_energy.dm index 2ab4c5641d..d29ed6bbe9 100644 --- a/code/modules/reagents/dispenser/dispenser2_energy.dm +++ b/code/modules/reagents/dispenser/dispenser2_energy.dm @@ -57,5 +57,6 @@ /obj/machinery/chemical_dispenser/bar_coffee dispense_reagents = list( - "coffee", "cafe_latte", "soy_latte", "hot_coco", "milk", "cream", "tea", "ice" + "coffee", "cafe_latte", "soy_latte", "hot_coco", "milk", "cream", "tea", "ice", + "orangejuice", "lemonjuice", "limejuice", "berryjuice", "mint" ) \ No newline at end of file From d8099edc4cd243672bd3600caf4506254270da61 Mon Sep 17 00:00:00 2001 From: Leshana Date: Sat, 11 Mar 2017 19:02:24 -0500 Subject: [PATCH 7/8] Make sure that the canisters selected have a bit o' air in them. --- code/modules/events/canister_leak.dm | 2 +- code/modules/gamemaster/actions/canister_leak.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/events/canister_leak.dm b/code/modules/events/canister_leak.dm index 956d8a0940..932a819671 100644 --- a/code/modules/events/canister_leak.dm +++ b/code/modules/events/canister_leak.dm @@ -7,7 +7,7 @@ // List of all non-destroyed canisters on station levels var/list/all_canisters = list() for(var/obj/machinery/portable_atmospherics/canister/C in machines) - if(!C.destroyed && (C.z in using_map.station_levels)) + if(!C.destroyed && (C.z in using_map.station_levels) && C.air_contents.total_moles >= MOLES_CELLSTANDARD) all_canisters += C for(var/i in 1 to 10) diff --git a/code/modules/gamemaster/actions/canister_leak.dm b/code/modules/gamemaster/actions/canister_leak.dm index ed55c0cded..a294f95736 100644 --- a/code/modules/gamemaster/actions/canister_leak.dm +++ b/code/modules/gamemaster/actions/canister_leak.dm @@ -15,7 +15,7 @@ // List of all non-destroyed canisters on station levels var/list/all_canisters = list() for(var/obj/machinery/portable_atmospherics/canister/C in machines) - if(!C.destroyed && (C.z in using_map.station_levels)) + if(!C.destroyed && (C.z in using_map.station_levels) && C.air_contents.total_moles >= MOLES_CELLSTANDARD) all_canisters += C var/obj/machinery/portable_atmospherics/canister/C = pick(all_canisters) log_debug("canister_leak event: Canister [C] ([C.x],[C.y],[C.z]) destroyed.") From 11b11850058a44172400cd809d159930c8aaf1f0 Mon Sep 17 00:00:00 2001 From: Neerti Date: Sun, 12 Mar 2017 09:30:48 -0400 Subject: [PATCH 8/8] Adds Two QOL Say/Emote Features --- .../preference_setup/global/setting_datums.dm | 6 ++ code/modules/mob/emote.dm | 4 + code/modules/mob/hear_say.dm | 87 +++++++++++++++++-- code/modules/mob/language/synthetic.dm | 13 ++- code/modules/mob/say.dm | 2 + 5 files changed, 101 insertions(+), 11 deletions(-) diff --git a/code/modules/client/preference_setup/global/setting_datums.dm b/code/modules/client/preference_setup/global/setting_datums.dm index d446a8f950..71559fed0e 100644 --- a/code/modules/client/preference_setup/global/setting_datums.dm +++ b/code/modules/client/preference_setup/global/setting_datums.dm @@ -126,6 +126,12 @@ var/list/_client_preferences_by_type enabled_description = "Show" disabled_description = "Hide" +/datum/client_preference/check_mention + description ="Emphasize Name Mention" + key = "CHAT_MENTION" + enabled_description = "Emphasize" + disabled_description = "Normal" + /datum/client_preference/show_progress_bar description ="Progress Bar" key = "SHOW_PROGRESS" diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 15b9992375..b2748e6f06 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -23,6 +23,8 @@ if (message) log_emote("[name]/[key] : [message]") + message = say_emphasis(message) + // Hearing gasp and such every five seconds is not good emotes were not global for a reason. // Maybe some people are okay with that. @@ -63,6 +65,8 @@ else input = message + input = say_emphasis(input) + if(input) log_emote("Ghost/[src.key] : [input]") if(!invisibility) //If the ghost is made visible by admins or cult. And to see if the ghost has toggled its own visibility, as well. -Mech diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index a240277d38..fe8c86619a 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -49,6 +49,8 @@ if(italics) message = "[message]" + message = say_emphasis(message) + var/track = null if(istype(src, /mob/observer/dead)) if(italics && is_preference_enabled(/datum/client_preference/ghost_radio)) @@ -66,20 +68,73 @@ else src << "[speaker_name][alt_name] talks but you cannot hear." else + var/message_to_send = null if(language) - on_hear_say("[speaker_name][alt_name] [track][language.format_message(message, verb)]") + message_to_send = "[speaker_name][alt_name] [track][language.format_message(message, verb)]" else - on_hear_say("[speaker_name][alt_name] [track][verb], \"[message]\"") + message_to_send = "[speaker_name][alt_name] [track][verb], \"[message]\"" + if(check_mentioned(message) && is_preference_enabled(/datum/client_preference/check_mention)) + message_to_send = "[message_to_send]" + + on_hear_say(message_to_send) + if (speech_sound && (get_dist(speaker, src) <= world.view && src.z == speaker.z)) var/turf/source = speaker? get_turf(speaker) : get_turf(src) src.playsound_local(source, speech_sound, sound_vol, 1) /mob/proc/on_hear_say(var/message) - src << message + to_chat(src, message) /mob/living/silicon/on_hear_say(var/message) var/time = say_timestamp() - src << "[time] [message]" + to_chat(src, "[time] [message]") + +// Checks if the mob's own name is included inside message. Handles both first and last names. +/mob/proc/check_mentioned(var/message) + var/list/valid_names = splittext(real_name, " ") // Should output list("John", "Doe") as an example. + valid_names += special_mentions() + for(var/name in valid_names) + if(findtext(message, name)) + return TRUE + return FALSE + +// Override this if you want something besides the mob's name to count for being mentioned in check_mentioned(). +/mob/proc/special_mentions() + return list() + +/mob/living/silicon/ai/special_mentions() + return list("AI") // AI door! + +// Converts specific characters, like *, /, and _ to formatted output. +/mob/proc/say_emphasis(var/message) + message = encode_html_emphasis(message, "/", "i") + message = encode_html_emphasis(message, "*", "b") + message = encode_html_emphasis(message, "_", "u") + return message + +// Replaces a character inside message with html tags. Note that html var must not include brackets. +// Will not create an open html tag if it would not have a closing one. +/proc/encode_html_emphasis(var/message, var/char, var/html) + var/i = 20 // Infinite loop safety. + var/pattern = "(?") - 1 + + // Now replace both. + message = replacetext(message, char, "<[html]>", first, first + 1) + message = replacetext(message, char, "", second + length_increase, second + length_increase + 1) + + // Check again to see if we need to keep going. + first = re.Find(message) + second = re.Find(message, first + 1) + i-- + if(!i) + CRASH("Possible infinite loop occured in encode_html_emphasis().") + return message /mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/part_c, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="") @@ -182,11 +237,15 @@ speaker_name = "[speaker.real_name] ([speaker_name])" track = "[speaker_name] ([ghost_follow_link(speaker, src)])" + message = say_emphasis(message) + var/formatted if(language) formatted = "[language.format_message_radio(message, verb)][part_c]" else formatted = "[verb], \"[message]\"[part_c]" + + if((sdisabilities & DEAF) || ear_deaf) if(prob(20)) src << "You feel your headset vibrate but can hear nothing from it!" @@ -197,18 +256,30 @@ return "\[[stationtime2text()]\]" /mob/proc/on_hear_radio(part_a, speaker_name, track, part_b, formatted) - src << "[part_a][speaker_name][part_b][formatted]" + var/final_message = "[part_a][speaker_name][part_b][formatted]" + if(check_mentioned(formatted) && is_preference_enabled(/datum/client_preference/check_mention)) + final_message = "[final_message]" + to_chat(src, final_message) /mob/observer/dead/on_hear_radio(part_a, speaker_name, track, part_b, formatted) - src << "[part_a][track][part_b][formatted]" + var/final_message = "[part_a][track][part_b][formatted]" + if(check_mentioned(formatted) && is_preference_enabled(/datum/client_preference/check_mention)) + final_message = "[final_message]" + to_chat(src, final_message) /mob/living/silicon/on_hear_radio(part_a, speaker_name, track, part_b, formatted) var/time = say_timestamp() - src << "[time][part_a][speaker_name][part_b][formatted]" + var/final_message = "[part_a][speaker_name][part_b][formatted]" + if(check_mentioned(formatted) && is_preference_enabled(/datum/client_preference/check_mention)) + final_message = "[time][final_message]" + to_chat(src, final_message) /mob/living/silicon/ai/on_hear_radio(part_a, speaker_name, track, part_b, formatted) var/time = say_timestamp() - src << "[time][part_a][track][part_b][formatted]" + var/final_message = "[part_a][track][part_b][formatted]" + if(check_mentioned(formatted) && is_preference_enabled(/datum/client_preference/check_mention)) + final_message = "[time][final_message]" + to_chat(src, final_message) /mob/proc/hear_signlang(var/message, var/verb = "gestures", var/datum/language/language, var/mob/speaker = null) if(!client) diff --git a/code/modules/mob/language/synthetic.dm b/code/modules/mob/language/synthetic.dm index dbf91343f1..2a2ddb0ff9 100644 --- a/code/modules/mob/language/synthetic.dm +++ b/code/modules/mob/language/synthetic.dm @@ -17,15 +17,19 @@ if (!message) return + message = speaker.say_emphasis(message) + var/message_start = "[name], [speaker.name]" var/message_body = "[speaker.say_quote(message)], \"[message]\"" for (var/mob/M in dead_mob_list) if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain)) //No meta-evesdropping - M.show_message("[message_start] ([ghost_follow_link(speaker, M)]) [message_body]", 2) + var/message_to_send = "[message_start] ([ghost_follow_link(speaker, M)]) [message_body]" + if(M.check_mentioned(message) && M.is_preference_enabled(/datum/client_preference/check_mention)) + message_to_send = "[message_to_send]" + M.show_message(message_to_send, 2) for (var/mob/living/S in living_mob_list) - if(drone_only && !istype(S,/mob/living/silicon/robot/drone)) continue else if(istype(S , /mob/living/silicon/ai)) @@ -33,7 +37,10 @@ else if (!S.binarycheck()) continue - S.show_message("[message_start] [message_body]", 2) + var/message_to_send = "[message_start] [message_body]" + if(S.check_mentioned(message) && S.is_preference_enabled(/datum/client_preference/check_mention)) + message_to_send = "[message_to_send]" + S.show_message(message_to_send, 2) var/list/listening = hearers(1, src) listening -= src diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index f7aaa52f78..0a029cf316 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -44,6 +44,8 @@ usr << "You have deadchat muted." return + message = say_emphasis(message) + say_dead_direct("[pick("complains","moans","whines","laments","blubbers")], \"[message]\"", src) /mob/proc/say_understands(var/mob/other,var/datum/language/speaking = null)