From a2cf2a4d1a0ea32010854664a35023649f4f92fd Mon Sep 17 00:00:00 2001 From: Yoshax Date: Tue, 21 Apr 2015 00:16:38 +0100 Subject: [PATCH 01/31] Adjusts custom item loadout costs to be more balanced and standardises costs, standard cosmetics are 1 point, items with uses/armor/storage are 2 points. --- code/modules/client/preferences_gear.dm | 155 ++++++++++++----------- html/changelogs/Yoshax-LoadoutPoints.YML | 5 + 2 files changed, 83 insertions(+), 77 deletions(-) create mode 100644 html/changelogs/Yoshax-LoadoutPoints.YML diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index dae2c09cbd2..1f51b6f050b 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -31,7 +31,7 @@ var/global/list/gear_datums = list() /datum/gear var/display_name //Name/index. Must be unique. var/path //Path to item. - var/cost //Number of points used. + var/cost //Number of points used. Items in general cost 1 point, storage/armor/gloves/special use costs 2 points. var/slot //Slot to equip to. var/list/allowed_roles //Roles that can spawn with this item. var/whitelisted //Term to check the whitelist for.. @@ -48,19 +48,19 @@ var/global/list/gear_datums = list() /datum/gear/gbandana display_name = "bandana, green" path = /obj/item/clothing/head/greenbandana - cost = 2 + cost = 1 slot = slot_head /datum/gear/obandana display_name = "bandana, orange" path = /obj/item/clothing/head/orangebandana - cost = 2 + cost = 1 slot = slot_head /datum/gear/bandana display_name = "bandana, pirate-red" path = /obj/item/clothing/head/bandana - cost = 2 + cost = 1 slot = slot_head /datum/gear/bsec_beret @@ -73,20 +73,20 @@ var/global/list/gear_datums = list() /datum/gear/eng_beret display_name = "beret, engie-orange" path = /obj/item/clothing/head/beret/eng - cost = 2 + cost = 1 slot = slot_head // allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer") /datum/gear/purp_beret display_name = "beret, purple" path = /obj/item/clothing/head/beret/jan - cost = 2 + cost = 1 slot = slot_head /datum/gear/red_beret display_name = "beret, red" path = /obj/item/clothing/head/beret - cost = 2 + cost = 1 slot = slot_head /datum/gear/sec_beret @@ -99,74 +99,74 @@ var/global/list/gear_datums = list() /datum/gear/bcap display_name = "cap, blue" path = /obj/item/clothing/head/soft/blue - cost = 2 + cost = 1 slot = slot_head /datum/gear/mailman display_name = "cap, blue station" path = /obj/item/clothing/head/mailman - cost = 2 + cost = 1 slot = slot_head /datum/gear/flatcap display_name = "cap, brown-flat" path = /obj/item/clothing/head/flatcap - cost = 2 + cost = 1 slot = slot_head /datum/gear/corpcap display_name = "cap, corporate (Security)" path = /obj/item/clothing/head/soft/sec/corp - cost = 2 + cost = 1 slot = slot_head allowed_roles = list("Security Officer","Head of Security","Warden") /datum/gear/gcap display_name = "cap, green" path = /obj/item/clothing/head/soft/green - cost = 2 + cost = 1 slot = slot_head /datum/gear/grcap display_name = "cap, grey" path = /obj/item/clothing/head/soft/grey - cost = 2 + cost = 1 slot = slot_head /datum/gear/ocap display_name = "cap, orange" path = /obj/item/clothing/head/soft/orange - cost = 2 + cost = 1 slot = slot_head /datum/gear/purcap display_name = "cap, purple" path = /obj/item/clothing/head/soft/purple - cost = 2 + cost = 1 slot = slot_head /datum/gear/raincap display_name = "cap, rainbow" path = /obj/item/clothing/head/soft/rainbow - cost = 3 + cost = 1 slot = slot_head /datum/gear/rcap display_name = "cap, red" path = /obj/item/clothing/head/soft/red - cost = 2 + cost = 1 slot = slot_head /datum/gear/ycap display_name = "cap, yellow" path = /obj/item/clothing/head/soft/yellow - cost = 2 + cost = 1 slot = slot_head /datum/gear/hairflower display_name = "hair flower pin" path = /obj/item/clothing/head/hairflower - cost = 2 + cost = 1 slot = slot_head /datum/gear/dbhardhat @@ -190,32 +190,32 @@ var/global/list/gear_datums = list() /datum/gear/boater display_name = "hat, boatsman" path = /obj/item/clothing/head/boaterhat - cost = 2 + cost = 1 slot = slot_head /datum/gear/bowler display_name = "hat, bowler" path = /obj/item/clothing/head/bowler - cost = 2 + cost = 1 slot = slot_head /datum/gear/fez display_name = "hat, fez" path = /obj/item/clothing/head/fez - cost = 2 + cost = 1 slot = slot_head // Wig by Earthcrusher, blame him. /datum/gear/philosopher_wig display_name = "natural philosopher's wig" path = /obj/item/clothing/head/philosopher_wig - cost = 3 + cost = 1 slot = slot_head /datum/gear/ushanka display_name = "ushanka" path = /obj/item/clothing/head/ushanka - cost = 2 + cost = 1 slot = slot_head // This was sprited and coded specifically for Zhan-Khazan characters. Before you @@ -223,7 +223,7 @@ var/global/list/gear_datums = list() /datum/gear/zhan_scarf display_name = "Zhan headscarf" path = /obj/item/clothing/head/tajaran/scarf - cost = 2 + cost = 1 slot = slot_head whitelisted = "Tajara" @@ -263,7 +263,7 @@ var/global/list/gear_datums = list() /datum/gear/prescription display_name = "sunglasses, presciption" path = /obj/item/clothing/glasses/sunglasses/prescription - cost = 3 + cost = 2 slot = slot_glasses // Mask @@ -280,67 +280,67 @@ var/global/list/gear_datums = list() display_name = "executive suit" path = /obj/item/clothing/under/suit_jacket/really_black slot = slot_w_uniform - cost = 2 + cost = 1 /datum/gear/blazer_blue display_name = "blazer, blue" path = /obj/item/clothing/under/blazer slot = slot_w_uniform - cost = 2 + cost = 1 /datum/gear/kilt display_name = "kilt" path = /obj/item/clothing/under/kilt slot = slot_w_uniform - cost = 3 + cost = 1 /datum/gear/blackjumpskirt display_name = "jumpskirt, black" path = /obj/item/clothing/under/blackjumpskirt slot = slot_w_uniform - cost = 2 + cost = 1 /datum/gear/skirt_blue display_name = "plaid skirt, blue" path = /obj/item/clothing/under/dress/plaid_blue slot = slot_w_uniform - cost = 2 + cost = 1 /datum/gear/skirt_purple display_name = "plaid skirt, purple" path = /obj/item/clothing/under/dress/plaid_purple slot = slot_w_uniform - cost = 2 + cost = 1 /datum/gear/skirt_red display_name = "plaid skirt, red" path = /obj/item/clothing/under/dress/plaid_red slot = slot_w_uniform - cost = 2 + cost = 1 /datum/gear/skirt_black display_name = "skirt, black" path = /obj/item/clothing/under/blackskirt slot = slot_w_uniform - cost = 2 + cost = 1 /datum/gear/sundress display_name = "sundress" path = /obj/item/clothing/under/sundress slot = slot_w_uniform - cost = 3 + cost = 1 /datum/gear/sundress_white display_name = "sundress, white" path = /obj/item/clothing/under/sundress_white slot = slot_w_uniform - cost = 3 + cost = 1 /datum/gear/cheongsam display_name = "cheongsam, white" path = /obj/item/clothing/under/cheongsam slot = slot_w_uniform - cost = 3 + cost = 1 /datum/gear/uniform_captain display_name = "uniform, captain's dress" @@ -352,7 +352,7 @@ var/global/list/gear_datums = list() /datum/gear/corpsecsuit display_name = "uniform, corporate (Security)" path = /obj/item/clothing/under/rank/security/corp - cost = 2 + cost = 1 slot = slot_w_uniform allowed_roles = list("Security Officer","Head of Security","Warden") @@ -373,7 +373,7 @@ var/global/list/gear_datums = list() /datum/gear/navysecsuit display_name = "uniform, navyblue (Security)" path = /obj/item/clothing/under/rank/security/navyblue - cost = 2 + cost = 1 slot = slot_w_uniform allowed_roles = list("Security Officer","Head of Security","Warden") @@ -389,7 +389,7 @@ var/global/list/gear_datums = list() display_name = "armband, EMT" path = /obj/item/clothing/accessory/armband/medgreen slot = slot_tie - cost = 2 + cost = 1 /datum/gear/armband_engineering display_name = "armband, engineering" @@ -425,21 +425,21 @@ var/global/list/gear_datums = list() display_name = "holster, armpit" path = /obj/item/clothing/accessory/holster/armpit slot = slot_tie - cost = 2 + cost = 1 allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective") /datum/gear/hip display_name = "holster, hip" path = /obj/item/clothing/accessory/holster/hip slot = slot_tie - cost = 2 + cost = 1 allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security", "Detective") /datum/gear/waist display_name = "holster, waist" path = /obj/item/clothing/accessory/holster/waist slot = slot_tie - cost = 2 + cost = 1 allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security", "Detective") /datum/gear/tie_blue @@ -464,14 +464,14 @@ var/global/list/gear_datums = list() display_name = "webbing, engineering" path = /obj/item/clothing/accessory/storage/brown_vest slot = slot_tie - cost = 2 + cost = 1 allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer") /datum/gear/black_vest display_name = "webbing, security" path = /obj/item/clothing/accessory/storage/black_vest slot = slot_tie - cost = 2 + cost = 1 allowed_roles = list("Security Officer","Head of Security","Warden") /datum/gear/webbing @@ -491,37 +491,37 @@ var/global/list/gear_datums = list() /datum/gear/bomber display_name = "bomber jacket" path = /obj/item/clothing/suit/storage/toggle/bomber - cost = 4 + cost = 2 slot = slot_wear_suit /datum/gear/leather_jacket display_name = "leather jacket, black" path = /obj/item/clothing/suit/storage/leather_jacket - cost = 3 + cost = 2 slot = slot_wear_suit /datum/gear/leather_jacket_nt display_name = "leather jacket, NanoTrasen, black" path = /obj/item/clothing/suit/storage/leather_jacket/nanotrasen - cost = 3 + cost = 2 slot = slot_wear_suit /datum/gear/brown_jacket display_name = "leather jacket, brown" path = /obj/item/clothing/suit/storage/toggle/brown_jacket - cost = 3 + cost = 2 slot = slot_wear_suit /datum/gear/brown_jacket_nt display_name = "leather jacket, NanoTrasen, brown" path = /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen - cost = 3 + cost = 2 slot = slot_wear_suit /datum/gear/blue_lawyer_jacket display_name = "suit jacket, blue" path = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket - cost = 3 + cost = 2 slot = slot_wear_suit /datum/gear/hoodie @@ -533,79 +533,80 @@ var/global/list/gear_datums = list() /datum/gear/hoodie/black display_name = "hoodie, black" path = /obj/item/clothing/suit/storage/toggle/hoodie/black + cost = 2 /datum/gear/unathi_mantle display_name = "hide mantle (Unathi)" path = /obj/item/clothing/suit/unathi/mantle - cost = 2 + cost = 1 slot = slot_wear_suit whitelisted = "Unathi" /datum/gear/labcoat display_name = "labcoat" path = /obj/item/clothing/suit/storage/toggle/labcoat - cost = 3 + cost = 2 slot = slot_wear_suit /datum/gear/overalls display_name = "overalls" path = /obj/item/clothing/suit/apron/overalls - cost = 2 + cost = 1 slot = slot_wear_suit /datum/gear/bponcho display_name = "poncho, blue" path = /obj/item/clothing/suit/poncho/blue - cost = 3 + cost = 1 slot = slot_wear_suit /datum/gear/gponcho display_name = "poncho, green" path = /obj/item/clothing/suit/poncho/green - cost = 3 + cost = 1 slot = slot_wear_suit /datum/gear/pponcho display_name = "poncho, purple" path = /obj/item/clothing/suit/poncho/purple - cost = 3 + cost = 1 slot = slot_wear_suit /datum/gear/rponcho display_name = "poncho, red" path = /obj/item/clothing/suit/poncho/red - cost = 3 + cost = 1 slot = slot_wear_suit /datum/gear/poncho display_name = "poncho, tan" path = /obj/item/clothing/suit/poncho - cost = 3 + cost = 1 slot = slot_wear_suit /datum/gear/unathi_robe display_name = "roughspun robe (Unathi)" path = /obj/item/clothing/suit/unathi/robe - cost = 3 + cost = 1 slot = slot_wear_suit // whitelisted = "Unathi" // You don't have a monopoly on a robe! /datum/gear/suspenders display_name = "suspenders" path = /obj/item/clothing/suit/suspenders - cost = 2 + cost = 1 slot = slot_wear_suit /datum/gear/wcoat display_name = "waistcoat" path = /obj/item/clothing/suit/wcoat - cost = 2 + cost = 1 slot = slot_wear_suit /datum/gear/zhan_furs display_name = "Zhan-Khazan furs (Tajaran)" path = /obj/item/clothing/suit/tajaran/furs - cost = 3 + cost = 1 slot = slot_wear_suit whitelisted = "Tajara" // You do have a monopoly on a fur suit tho @@ -620,7 +621,7 @@ var/global/list/gear_datums = list() /datum/gear/blue_gloves display_name = "gloves, blue" path = /obj/item/clothing/gloves/blue - cost = 1 + cost = 2 slot = slot_gloves /datum/gear/brown_gloves @@ -632,19 +633,19 @@ var/global/list/gear_datums = list() /datum/gear/green_gloves display_name = "gloves, green" path = /obj/item/clothing/gloves/green - cost = 1 + cost = 2 slot = slot_gloves /datum/gear/orange_gloves display_name = "gloves, orange" path = /obj/item/clothing/gloves/orange - cost = 1 + cost = 2 slot = slot_gloves /datum/gear/red_gloves display_name = "gloves, red" path = /obj/item/clothing/gloves/red - cost = 1 + cost = 2 slot = slot_gloves /datum/gear/white_gloves @@ -658,13 +659,13 @@ var/global/list/gear_datums = list() /datum/gear/jackboots display_name = "jackboots" path = /obj/item/clothing/shoes/jackboots - cost = 2 + cost = 1 slot = slot_shoes /datum/gear/toeless_jackboots display_name = "toe-less jackboots" - path = /obj/item/clothing/shoes/jackboots/fluff/kecer_eldraran //permisson of owner of custom item was granted - cost = 2 + path = /obj/item/clothing/shoes/jackboots/fluff/kecer_eldraran + cost = 1 slot = slot_shoes /datum/gear/sandal @@ -807,7 +808,7 @@ var/global/list/gear_datums = list() display_name = "cane" path = /obj/item/weapon/cane sort_category = "misc" - cost = 2 + cost = 1 /datum/gear/dice display_name = "d20" @@ -849,13 +850,13 @@ var/global/list/gear_datums = list() display_name = "matchbook" path = /obj/item/weapon/storage/box/matches sort_category = "misc" - cost = 2 + cost = 1 /datum/gear/comb display_name = "purple comb" path = /obj/item/weapon/haircomb sort_category = "misc" - cost = 2 + cost = 1 /*/datum/gear/combitool display_name = "combi-tool" @@ -867,27 +868,27 @@ var/global/list/gear_datums = list() /datum/gear/skrell_chain display_name = "skrell headtail-wear, female, chain" path = /obj/item/clothing/ears/skrell/chain - cost = 2 + cost = 1 sort_category = "ears" whitelisted = "Skrell" /datum/gear/skrell_plate display_name = "skrell headtail-wear, male, bands" path = /obj/item/clothing/ears/skrell/band - cost = 2 + cost = 1 sort_category = "ears" whitelisted = "Skrell" /datum/gear/skrell_cloth_male display_name = "skrell headtail-wear, male, cloth" path = /obj/item/clothing/ears/skrell/cloth_male - cost = 2 + cost = 1 sort_category = "ears" whitelisted = "Skrell" /datum/gear/skrell_cloth_female display_name = "skrell headtail-wear, female, cloth" path = /obj/item/clothing/ears/skrell/cloth_female - cost = 2 + cost = 1 sort_category = "ears" whitelisted = "Skrell" diff --git a/html/changelogs/Yoshax-LoadoutPoints.YML b/html/changelogs/Yoshax-LoadoutPoints.YML new file mode 100644 index 00000000000..051e156a2d9 --- /dev/null +++ b/html/changelogs/Yoshax-LoadoutPoints.YML @@ -0,0 +1,5 @@ +author: Yoshax +delete-after: True + +changes: + - tweak: "Adjusts custom loadout costs to be more standardised and balances. Purely cosmetic items, shoes, hats, and all things that do not provide a straight advtange (sterile mask, or pAI, protection from viruses and possible door hacking or records access, respectively), each cost 1 point, items that provide an advantage like those just mentioned, or provide armor or storage cost 2 points." \ No newline at end of file From 7a6a54b671e3f6bc5f3f5af46ba409921bac024f Mon Sep 17 00:00:00 2001 From: mwerezak Date: Thu, 23 Apr 2015 08:25:49 -0400 Subject: [PATCH 02/31] Fixes Snapwalk's Limb Augment item being removable through the inventory panel I haven't heard of any issues on the server about this, but it's probably best to prevent them from being removed. --- code/modules/customitems/item_defines.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 13d1a59d5e7..43fe4f27f30 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -1131,6 +1131,7 @@ icon_state = "parker_eliza_arms" item_state = "parker_eliza_arms" item_color = "parker_eliza_arms" + canremove = 0 ////////////// Accessories ///// From 0a7fd34f3f14c6a7d635d751b420e8b920a2749a Mon Sep 17 00:00:00 2001 From: mwerezak Date: Thu, 23 Apr 2015 11:27:16 -0400 Subject: [PATCH 03/31] Limb augments no longer prevent putting on jumpsuits --- code/modules/customitems/item_defines.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 43fe4f27f30..820ab2fcaa5 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -1131,6 +1131,7 @@ icon_state = "parker_eliza_arms" item_state = "parker_eliza_arms" item_color = "parker_eliza_arms" + body_parts_covered = 0 //technicially it's underneath everything canremove = 0 From 4d9586ecae54344bd232901b830b6862403c8e79 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sat, 25 Apr 2015 02:55:04 -0400 Subject: [PATCH 04/31] Fixes balaclava sprite sheets --- code/modules/clothing/masks/boxing.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index dfa7e120f74..fb675801c9e 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -8,8 +8,8 @@ body_parts_covered = FACE w_class = 2 sprite_sheets = list( - "Tajara" = 'icons/mob/species/tajaran/helmet.dmi', - "Unathi" = 'icons/mob/species/unathi/helmet.dmi', + "Tajara" = 'icons/mob/species/tajaran/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', ) /obj/item/clothing/mask/balaclava/tactical @@ -21,8 +21,8 @@ flags_inv = HIDEFACE w_class = 2 sprite_sheets = list( - "Tajara" = 'icons/mob/species/tajaran/helmet.dmi', - "Unathi" = 'icons/mob/species/unathi/helmet.dmi', + "Tajara" = 'icons/mob/species/tajaran/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', ) /obj/item/clothing/mask/luchador From 53a95d8effcbefa3ec3d654ead7d727d5397ca2a Mon Sep 17 00:00:00 2001 From: volas Date: Mon, 20 Apr 2015 23:09:24 +0300 Subject: [PATCH 05/31] Fixes #8913 --- code/modules/paperwork/paper.dm | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 6c91d2de032..29c1dbcd57a 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -22,6 +22,7 @@ var/info_links //A different version of the paper which includes html links at fields and EOF var/stamps //The (text for the) stamps on the paper. var/fields //Amount of user created fields + var/free_space = MAX_PAPER_MESSAGE_LEN var/list/stamped var/list/ico[0] //Icons and var/list/offset_x[0] //offsets stored for later @@ -51,6 +52,7 @@ spawn(2) update_icon() + update_space(info) updateinfolinks() return @@ -62,6 +64,12 @@ return icon_state = "paper" +/obj/item/weapon/paper/proc/update_space(var/new_text) + if(!new_text) + return + + free_space -= length(strip_html_properly(new_text, 0)) + /obj/item/weapon/paper/examine(mob/user) ..() if(in_range(user, src) || istype(user, /mob/dead/observer)) @@ -188,6 +196,7 @@ /obj/item/weapon/paper/proc/clearpaper() info = null stamps = null + free_space = MAX_BOOK_MESSAGE_LEN stamped = list() overlays.Cut() updateinfolinks() @@ -325,12 +334,11 @@ var/id = href_list["write"] //var/t = strip_html_simple(input(usr, "What text do you wish to add to " + (id=="end" ? "the end of the paper" : "field "+id) + "?", "[name]", null),8192) as message - var/textlimit = MAX_PAPER_MESSAGE_LEN - length(info) - if(textlimit <= 0) + if(free_space <= 0) usr << "You're trying to find a free place on paper, but can't!" return - var/t = strip_html_simple(input("Enter what you want to write:", "Write", null, null) as message, textlimit) + var/t = strip_html_simple(input("Enter what you want to write:", "Write", null, null) as message, free_space) if(!t) return @@ -375,6 +383,8 @@ info += t // Oh, he wants to edit to the end of the file, let him. updateinfolinks() + update_space(t) + usr << browse("[name][info_links][stamps]", "window=[name]") // Update the window update_icon() From dd02f9e9f0e009b47476a2ed1ca47b84c353e0ed Mon Sep 17 00:00:00 2001 From: Daranz Date: Sat, 25 Apr 2015 09:09:03 -0400 Subject: [PATCH 06/31] Fix cell charger icon not updating when cell taken out by a borg --- code/game/machinery/cell_charger.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index a02553cc77e..683e6e12202 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -11,7 +11,7 @@ var/obj/item/weapon/cell/charging = null var/chargelevel = -1 -/obj/machinery/cell_charger/proc/updateicon() +/obj/machinery/cell_charger/update_icon() icon_state = "ccharger[charging ? 1 : 0]" if(charging && !(stat & (BROKEN|NOPOWER)) ) @@ -57,7 +57,7 @@ charging = W user.visible_message("[user] inserts a cell into the charger.", "You insert a cell into the charger.") chargelevel = -1 - updateicon() + update_icon() else if(istype(W, /obj/item/weapon/wrench)) if(charging) user << "\red Remove the cell first!" @@ -76,7 +76,7 @@ src.charging = null user.visible_message("[user] removes the cell from the charger.", "You remove the cell from the charger.") chargelevel = -1 - updateicon() + update_icon() /obj/machinery/cell_charger/attack_ai(mob/user) if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) // Borgs can remove the cell if they are near enough @@ -108,6 +108,6 @@ charging.give(active_power_usage*CELLRATE) update_use_power(2) - updateicon() + update_icon() else update_use_power(1) From 89a72fb326b14762f1cf6112bcf9f34f8773da21 Mon Sep 17 00:00:00 2001 From: RavingManiac Date: Mon, 27 Apr 2015 12:10:54 +1000 Subject: [PATCH 07/31] Candle burn time increased to ~30 minutes Some fluff added to candle description explaining how they burn in space --- code/game/objects/items/weapons/candle.dm | 16 +++++++++++----- html/changelogs/RavingManiac-master.yml | 5 +++++ 2 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 html/changelogs/RavingManiac-master.yml diff --git a/code/game/objects/items/weapons/candle.dm b/code/game/objects/items/weapons/candle.dm index 593e85efdd3..03f060f1551 100644 --- a/code/game/objects/items/weapons/candle.dm +++ b/code/game/objects/items/weapons/candle.dm @@ -1,18 +1,24 @@ /obj/item/weapon/flame/candle name = "red candle" - desc = "a candle" + desc = "a small pillar candle. Its specially-formulated fuel-oxidizer wax mixture allows continued combustion in airless environments." icon = 'icons/obj/candle.dmi' icon_state = "candle1" item_state = "candle1" w_class = 1 - var/wax = 200 + var/wax = 0 + var/starting_wax = 0 + +/obj/item/weapon/flame/candle/New() + wax = rand(800, 1000) // Enough for 27-33 minutes. 30 minutes on average. + starting_wax = wax + ..() /obj/item/weapon/flame/candle/update_icon() var/i - if(wax>150) + if(wax > starting_wax*3/4) i = 1 - else if(wax>80) + else if(wax > starting_wax*2/5) i = 2 else i = 3 icon_state = "candle[i][lit ? "_lit" : ""]" @@ -80,4 +86,4 @@ /obj/item/weapon/flame/candle/dropped(mob/user) if(lit) user.SetLuminosity(user.luminosity - CANDLE_LUM) - SetLuminosity(CANDLE_LUM) + SetLuminosity(CANDLE_LUM) \ No newline at end of file diff --git a/html/changelogs/RavingManiac-master.yml b/html/changelogs/RavingManiac-master.yml new file mode 100644 index 00000000000..9d3ea70147b --- /dev/null +++ b/html/changelogs/RavingManiac-master.yml @@ -0,0 +1,5 @@ +author: RavingManiac +delete-after: True + +changes: + - tweak: "Candles now burn for about 30 mintutes." From 159ad76fab4fcbb791867ef32e689599ca2fb058 Mon Sep 17 00:00:00 2001 From: Kelenius Date: Mon, 27 Apr 2015 08:06:21 +0300 Subject: [PATCH 08/31] Fixes #8998 --- code/modules/hydroponics/seed_storage.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index 469896018e8..e64ad1e8131 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -231,12 +231,15 @@ S.remove_from_storage(O, src) O.loc = src + var/newID = 0 for (var/datum/seed_pile/N in piles) if (N.matches(O)) ++N.amount N.seeds += (O) return + else if(N.ID >= newID) + newID = N.ID + 1 - piles += new /datum/seed_pile(O, piles.len) + piles += new /datum/seed_pile(O, newID) return From aa115f5bb217247284945f13221eae9d8f8fb2f9 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Mon, 27 Apr 2015 16:41:47 +0100 Subject: [PATCH 09/31] Fixes antag surgery kit --- code/game/objects/items/weapons/storage/firstaid.dm | 4 ++++ html/changelogs/Yoshax-ICanIntoSurgery.YML | 5 +++++ 2 files changed, 9 insertions(+) create mode 100644 html/changelogs/Yoshax-ICanIntoSurgery.YML diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 304c59fb982..7b2c03ba4a3 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -131,6 +131,7 @@ /obj/item/weapon/storage/firstaid/surgery name = "surgery kit" desc = "Contains tools for surgery." + storage_slots = 10 /obj/item/weapon/storage/firstaid/surgery/New() ..() @@ -142,6 +143,9 @@ new /obj/item/weapon/retractor(src) new /obj/item/weapon/scalpel(src) new /obj/item/weapon/surgicaldrill(src) + new /obj/item/weapon/bonegel(src) + new /obj/item/weapon/FixOVein(src) + new /obj/item/stack/medical/advanced/bruise_pack(src) return /* diff --git a/html/changelogs/Yoshax-ICanIntoSurgery.YML b/html/changelogs/Yoshax-ICanIntoSurgery.YML new file mode 100644 index 00000000000..9aa57af213f --- /dev/null +++ b/html/changelogs/Yoshax-ICanIntoSurgery.YML @@ -0,0 +1,5 @@ +author: Yoshax +delete-after: True + +changes: + - tweak: "Adds items to the orderable antag surgical kit so its actually useful for surgery." \ No newline at end of file From d0615430ecad37db85c0e360265a465bec9f8406 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Mon, 27 Apr 2015 01:25:45 -0400 Subject: [PATCH 10/31] Fixes #8997 Gibbing a human now causes all items on or in their person to get thrown around. This includes implants and bullet shrapnel. --- code/modules/mob/living/carbon/human/death.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 466742046bb..5a439731975 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -15,6 +15,10 @@ // Override the current limb status and don't cause an explosion E.droplimb(1,1) + for(var/obj/item/I in src) + drop_from_inventory(I) + I.throw_at(get_edge_target_turf(src,pick(alldirs)), rand(1,3), round(30/I.w_class)) + ..(species.gibbed_anim) gibs(loc, viruses, dna, null, species.flesh_color, species.blood_color) From 36d9944dfd5a7f00f40281fbb8812ac29b0b63a5 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Mon, 27 Apr 2015 01:49:18 -0400 Subject: [PATCH 11/31] Fixes #8977 --- code/modules/power/lighting.dm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 7c9ae41cf25..d513d2ff120 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -9,7 +9,7 @@ #define LIGHT_BROKEN 2 #define LIGHT_BURNED 3 - +#define LIGHT_BULB_TEMPERATURE 400 //K - used value for a 60W bulb /obj/item/light_fixture_frame name = "light fixture frame" @@ -487,11 +487,13 @@ var/mob/living/carbon/human/H = user if(istype(H)) - - if(H.gloves) + if(H.species.heat_level_1 > LIGHT_BULB_TEMPERATURE) + prot = 1 + else if(H.gloves) var/obj/item/clothing/gloves/G = H.gloves if(G.max_heat_protection_temperature) - prot = (G.max_heat_protection_temperature > 360) + if(G.max_heat_protection_temperature > LIGHT_BULB_TEMPERATURE) + prot = 1 else prot = 1 From 59e17f7a9b7f47880d4b8c18a05692f7035c2ce9 Mon Sep 17 00:00:00 2001 From: volas Date: Tue, 28 Apr 2015 00:41:14 +0300 Subject: [PATCH 12/31] small fix --- code/modules/paperwork/paper.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 29c1dbcd57a..87d5f002eeb 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -196,7 +196,7 @@ /obj/item/weapon/paper/proc/clearpaper() info = null stamps = null - free_space = MAX_BOOK_MESSAGE_LEN + free_space = MAX_PAPER_MESSAGE_LEN stamped = list() overlays.Cut() updateinfolinks() From 6c8bc809c6a80e3af8a5a8fb8915e4d055f53996 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Tue, 28 Apr 2015 20:37:57 +0100 Subject: [PATCH 13/31] Adds more items to custom loadout --- code/modules/client/preferences_gear.dm | 310 +++++++++++++++++++++-- html/changelogs/Yoshax-Alloftheitems.YML | 4 + 2 files changed, 297 insertions(+), 17 deletions(-) create mode 100644 html/changelogs/Yoshax-Alloftheitems.YML diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 1f51b6f050b..413e8082a86 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -163,6 +163,12 @@ var/global/list/gear_datums = list() cost = 1 slot = slot_head +/datum/gear/wcap + display_name = "cap, white" + path = /obj/item/clothing/head/soft/mime + cost = 1 + slot = slot_head + /datum/gear/hairflower display_name = "hair flower pin" path = /obj/item/clothing/head/hairflower @@ -181,12 +187,24 @@ var/global/list/gear_datums = list() cost = 2 slot = slot_head +/datum/gear/rhardhat + display_name = "hardhat, red" + path = /obj/item/clothing/head/hardhat/red + cost = 2 + slot = slot_head + /datum/gear/yhardhat display_name = "hardhat, yellow" path = /obj/item/clothing/head/hardhat cost = 2 slot = slot_head +/datum/gear/whardhat + display_name = "hardhat, white" + path = /obj/item/clothing/head/hardhat/white + cost = 2 + slot = slot_head + /datum/gear/boater display_name = "hat, boatsman" path = /obj/item/clothing/head/boaterhat @@ -205,6 +223,12 @@ var/global/list/gear_datums = list() cost = 1 slot = slot_head +/datum/gear/tophat + display_name = "hat, tophat" + path = /obj/item/clothing/head/that + cost = 1 + slot = slot_head + // Wig by Earthcrusher, blame him. /datum/gear/philosopher_wig display_name = "natural philosopher's wig" @@ -239,12 +263,37 @@ var/global/list/gear_datums = list() display_name = "Glasses, green" path = /obj/item/clothing/glasses/gglasses cost = 1 + slot = slot_glasses + +/datum/gear/prescriptionhipster + display_name = "Glasses, hipster" + path = /obj/item/clothing/glasses/regular/hipster + cost = 1 + slot = slot_glasses + +/datum/gear/prescription + display_name = "Glasses, prescription" + path = /obj/item/clothing/glasses/regular + cost = 1 + slot = slot_glasses + +/datum/gear/monocle + display_name = "Monocle" + path = /obj/item/clothing/glasses/monocle + cost = 1 + slot = slot_glasses /datum/gear/scanning_goggles display_name = "scanning goggles" path = /obj/item/clothing/glasses/fluff/uzenwa_sissra_1 cost = 1 -// allowed_roles = list("Roboticist", "Scientist", "Research Director") + slot = slot_glasses + +/datum/gear/sciencegoggles + display_name = "Science Goggles" + path = /obj/item/clothing/glasses/science + cost = 1 + slot = slot_glasses /datum/gear/security display_name = "Security HUD" @@ -260,7 +309,7 @@ var/global/list/gear_datums = list() slot = slot_glasses allowed_roles = list("Security Officer","Head of Security","Warden") -/datum/gear/prescription +/datum/gear/prescriptionsun display_name = "sunglasses, presciption" path = /obj/item/clothing/glasses/sunglasses/prescription cost = 2 @@ -276,18 +325,18 @@ var/global/list/gear_datums = list() // Uniform slot -/datum/gear/exec_suit - display_name = "executive suit" - path = /obj/item/clothing/under/suit_jacket/really_black - slot = slot_w_uniform - cost = 1 - /datum/gear/blazer_blue display_name = "blazer, blue" path = /obj/item/clothing/under/blazer slot = slot_w_uniform cost = 1 +/datum/gear/cheongsam + display_name = "cheongsam, white" + path = /obj/item/clothing/under/cheongsam + slot = slot_w_uniform + cost = 1 + /datum/gear/kilt display_name = "kilt" path = /obj/item/clothing/under/kilt @@ -300,6 +349,17 @@ var/global/list/gear_datums = list() slot = slot_w_uniform cost = 1 +/datum/gear/blackfjumpsuit + display_name = "jumpsuit, female-black" + path = /obj/item/clothing/under/color/blackf + slot = slot_w_uniform + cost = 1 +/datum/gear/blackfjumpsuit + display_name = "jumpsuit, rainbow" + path = /obj/item/clothing/under/rainbow + slot = slot_w_uniform + cost = 1 + /datum/gear/skirt_blue display_name = "plaid skirt, blue" path = /obj/item/clothing/under/dress/plaid_blue @@ -324,6 +384,114 @@ var/global/list/gear_datums = list() slot = slot_w_uniform cost = 1 +/datum/gear/amishsuit + display_name = "suit, amish" + path = /obj/item/clothing/under/sl_suit + slot = slot_w_uniform + cost = 1 + +/datum/gear/blacksuit + display_name = "suit, black" + path = /obj/item/clothing/under/suit_jacket + slot = slot_w_uniform + cost = 1 + +/datum/gear/shinyblacksuit + display_name = "suit, shiny-black" + path = /obj/item/clothing/under/lawyer/black + slot = slot_w_uniform + cost = 1 + +/datum/gear/bluesuit + display_name = "suit, blue" + path = /obj/item/clothing/under/lawyer/blue + slot = slot_w_uniform + cost = 1 + +/datum/gear/burgundysuit + display_name = "suit, burgundy" + path = /obj/item/clothing/under/suit_jacket/burgundy + slot = slot_w_uniform + cost = 1 + +/datum/gear/checkeredsuit + display_name = "suit, checkered" + path = /obj/item/clothing/under/suit_jacket/checkered + slot = slot_w_uniform + cost = 1 + +/datum/gear/charcoalsuit + display_name = "suit, charcoal" + path = /obj/item/clothing/under/suit_jacket/charcoal + slot = slot_w_uniform + cost = 1 + +/datum/gear/execsuit + display_name = "suit, executive" + path = /obj/item/clothing/under/suit_jacket/really_black + slot = slot_w_uniform + cost = 1 + +/datum/gear/femaleexecsuit + display_name = "suit, female-executive" + path = /obj/item/clothing/under/suit_jacket/female + slot = slot_w_uniform + cost = 1 + +/datum/gear/gentlesuit + display_name = "suit, gentlemen" + path = /obj/item/clothing/under/gentlesuit + slot = slot_w_uniform + cost = 1 + +/datum/gear/navysuit + display_name = "suit, navy" + path = /obj/item/clothing/under/suit_jacket/navy + slot = slot_w_uniform + cost = 1 + +/datum/gear/redsuit + display_name = "suit, red" + path = /obj/item/clothing/under/suit_jacket/red + slot = slot_w_uniform + cost = 1 + +/datum/gear/redlawyer + display_name = "suit, lawyer-red" + path = /obj/item/clothing/under/lawyer/red + slot = slot_w_uniform + cost = 1 + +/datum/gear/oldmansuit + display_name = "suit, old-man" + path = /obj/item/clothing/under/lawyer/oldman + slot = slot_w_uniform + cost = 1 + +/datum/gear/purplesuit + display_name = "suit, purple" + path = /obj/item/clothing/under/lawyer/purpsuit + slot = slot_w_uniform + cost = 1 + +/datum/gear/tansuit + display_name = "suit, tan" + path = /obj/item/clothing/under/suit_jacket/tan + slot = slot_w_uniform + cost = 1 + +/datum/gear/whitesuit + display_name = "suit, white" + path = /obj/item/clothing/under/scratch + slot = slot_w_uniform + cost = 1 + +/datum/gear/whitebluesuit + display_name = "suit, white-blue" + path = /obj/item/clothing/under/lawyer/bluesuit + slot = slot_w_uniform + cost = 1 + /datum/gear/sundress display_name = "sundress" path = /obj/item/clothing/under/sundress @@ -336,12 +504,6 @@ var/global/list/gear_datums = list() slot = slot_w_uniform cost = 1 -/datum/gear/cheongsam - display_name = "cheongsam, white" - path = /obj/item/clothing/under/cheongsam - slot = slot_w_uniform - cost = 1 - /datum/gear/uniform_captain display_name = "uniform, captain's dress" path = /obj/item/clothing/under/dress/dress_cap @@ -518,9 +680,9 @@ var/global/list/gear_datums = list() cost = 2 slot = slot_wear_suit -/datum/gear/blue_lawyer_jacket - display_name = "suit jacket, blue" - path = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket +/datum/gear/hazard_vest + display_name = "hazard vest" + path = /obj/item/clothing/suit/storage/hazardvest cost = 2 slot = slot_wear_suit @@ -548,6 +710,36 @@ var/global/list/gear_datums = list() cost = 2 slot = slot_wear_suit +/datum/gear/bluelabcoat + display_name = "labcoat, blue" + path = /obj/item/clothing/suit/storage/toggle/labcoat/blue + cost = 2 + slot = slot_wear_suit + +/datum/gear/greenlabcoat + display_name = "labcoat, green" + path = /obj/item/clothing/suit/storage/toggle/labcoat/green + cost = 2 + slot = slot_wear_suit + +/datum/gear/orangelabcoat + display_name = "labcoat, orange" + path = /obj/item/clothing/suit/storage/toggle/labcoat/orange + cost = 2 + slot = slot_wear_suit + +/datum/gear/purplelabcoat + display_name = "labcoat, purple" + path = /obj/item/clothing/suit/storage/toggle/labcoat/purple + cost = 2 + slot = slot_wear_suit + +/datum/gear/redlabcoat + display_name = "labcoat, red" + path = /obj/item/clothing/suit/storage/toggle/labcoat/red + cost = 2 + slot = slot_wear_suit + /datum/gear/overalls display_name = "overalls" path = /obj/item/clothing/suit/apron/overalls @@ -591,6 +783,18 @@ var/global/list/gear_datums = list() slot = slot_wear_suit // whitelisted = "Unathi" // You don't have a monopoly on a robe! +/datum/gear/blue_lawyer_jacket + display_name = "suit jacket, blue" + path = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket + cost = 2 + slot = slot_wear_suit + +/datum/gear/purple_lawyer_jacket + display_name = "suit jacket, purple" + path = /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket + cost = 2 + slot = slot_wear_suit + /datum/gear/suspenders display_name = "suspenders" path = /obj/item/clothing/suit/suspenders @@ -630,18 +834,49 @@ var/global/list/gear_datums = list() cost = 2 slot = slot_gloves +/datum/gear/light_brown_gloves + display_name = "gloves, light-brown" + path = /obj/item/clothing/gloves/light_brown + cost = 2 + slot = slot_gloves + /datum/gear/green_gloves display_name = "gloves, green" path = /obj/item/clothing/gloves/green cost = 2 slot = slot_gloves +/datum/gear/grey_gloves + display_name = "gloves, grey" + path = /obj/item/clothing/gloves/grey + cost = 2 + slot = slot_gloves + +/datum/gear/latex_gloves + display_name = "gloves, latex" + path = /obj/item/clothing/gloves/latex + cost = 2 + slot = slot_gloves + + /datum/gear/orange_gloves display_name = "gloves, orange" path = /obj/item/clothing/gloves/orange cost = 2 slot = slot_gloves +/datum/gear/purple_gloves + display_name = "gloves, purple" + path = /obj/item/clothing/gloves/purple + cost = 2 + slot = slot_gloves + +/datum/gear/rainbow_gloves + display_name = "gloves, rainbow" + path = /obj/item/clothing/gloves/rainbow + cost = 2 + slot = slot_gloves + /datum/gear/red_gloves display_name = "gloves, red" path = /obj/item/clothing/gloves/red @@ -728,6 +963,12 @@ var/global/list/gear_datums = list() cost = 1 slot = slot_shoes +/datum/gear/rainbow_shoes + display_name = "shoes, rainbow" + path = /obj/item/clothing/shoes/rainbow + cost = 1 + slot = slot_shoes + /datum/gear/red_shoes display_name = "shoes, red" path = /obj/item/clothing/shoes/red @@ -822,6 +1063,17 @@ var/global/list/gear_datums = list() sort_category = "misc" cost = 1 +/datum/gear/flask + display_name = "flask" + path = /obj/item/weapon/reagent_containers/food/drinks/flask/barflask + sort_category = "misc" + cost = 1 + +/datum/gear/vacflask + display_name = "vacuum-flask" + path = /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask + sort_category = "misc" + cost = 1 /datum/gear/blipstick display_name = "lipstick, black" path = /obj/item/weapon/lipstick/black @@ -846,6 +1098,18 @@ var/global/list/gear_datums = list() sort_category = "misc" cost = 1 +/datum/gear/smokingpipe + display_name = "pipe, smoking" + path = /obj/item/clothing/mask/smokable/pipe + sort_category = "misc" + cost = 1 + +/datum/gear/cornpipe + display_name = "pipe, corn" + path = /obj/item/clothing/mask/smokable/pipe/cobpipe + sort_category = "misc" + cost = 1 + /datum/gear/matchbook display_name = "matchbook" path = /obj/item/weapon/storage/box/matches @@ -858,6 +1122,12 @@ var/global/list/gear_datums = list() sort_category = "misc" cost = 1 +/datum/gear/zippo + display_name = "zippo" + path = /obj/item/weapon/flame/lighter/zippo + sort_category = "misc" + cost = 1 + /*/datum/gear/combitool display_name = "combi-tool" path = /obj/item/weapon/combitool @@ -865,6 +1135,12 @@ var/global/list/gear_datums = list() // Stuff worn on the ears. Items here go in the "ears" sort_category but they must not use // the slot_r_ear or slot_l_ear as the slot, or else players will spawn with no headset. +/datum/gear/earmuffs + display_name = "earmuffs" + path = /obj/item/clothing/ears/earmuffs + cost = 1 + sort_category = "ears" + /datum/gear/skrell_chain display_name = "skrell headtail-wear, female, chain" path = /obj/item/clothing/ears/skrell/chain diff --git a/html/changelogs/Yoshax-Alloftheitems.YML b/html/changelogs/Yoshax-Alloftheitems.YML new file mode 100644 index 00000000000..57d50b195b7 --- /dev/null +++ b/html/changelogs/Yoshax-Alloftheitems.YML @@ -0,0 +1,4 @@ +author: Yoshax +delete-after: True +changes: + - rscadd: "Adds more items to custom loadout, including a number of dressy suits and some other things." From e5cd8c7adb5a8790820369f46099af5c655409a9 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Tue, 28 Apr 2015 20:40:16 +0100 Subject: [PATCH 14/31] Fixes jacket --- code/modules/client/preferences_gear.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 413e8082a86..2431d481093 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -791,7 +791,7 @@ var/global/list/gear_datums = list() /datum/gear/purple_lawyer_jacket display_name = "suit jacket, purple" - path = /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket + path = /obj/item/clothing/suit/storage/lawyer/purpjacket cost = 2 slot = slot_wear_suit From fbede7a1931df4d093f048c5e73a89145ac2b2f2 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Tue, 28 Apr 2015 23:00:56 -0400 Subject: [PATCH 15/31] Minor ZAS-related cleanup --- code/ZAS/Atom.dm | 2 +- code/ZAS/Turf.dm | 7 +++++-- code/__HELPERS/unsorted.dm | 24 ------------------------ code/game/turfs/turf.dm | 12 +----------- 4 files changed, 7 insertions(+), 38 deletions(-) diff --git a/code/ZAS/Atom.dm b/code/ZAS/Atom.dm index 6f75f4ea295..e655295f783 100644 --- a/code/ZAS/Atom.dm +++ b/code/ZAS/Atom.dm @@ -50,7 +50,7 @@ atom/proc/c_airblock(turf/other) #ifdef ZASDBG ASSERT(isturf(other)) #endif - return !CanPass(null, other, 0, 0) + 2*!CanPass(null, other, 1.5, 1) + return (AIR_BLOCKED*!CanPass(null, other, 0, 0))|(ZONE_BLOCKED*!CanPass(null, other, 1.5, 1)) turf/c_airblock(turf/other) diff --git a/code/ZAS/Turf.dm b/code/ZAS/Turf.dm index 9d031ce3d39..1b770590e10 100644 --- a/code/ZAS/Turf.dm +++ b/code/ZAS/Turf.dm @@ -46,6 +46,7 @@ air_master.connect(sim, src) /turf/simulated/update_air_properties() + if(zone && zone.invalid) c_copy_air() zone = null //Easier than iterating through the list at the zone. @@ -120,8 +121,10 @@ //Might have assigned a zone, since this happens for each direction. if(!zone) - //if((block & ZONE_BLOCKED) || (r_block & ZONE_BLOCKED && !(s_block & ZONE_BLOCKED))) - if(((block & ZONE_BLOCKED) && !(r_block & ZONE_BLOCKED)) || (r_block & ZONE_BLOCKED && !(s_block & ZONE_BLOCKED))) + //We do not merge if + // they are blocking us and we are not blocking them, or if + // we are blocking them and not blocking ourselves - this prevents tiny zones from forming on doorways. + if(((block & ZONE_BLOCKED) && !(r_block & ZONE_BLOCKED)) || ((r_block & ZONE_BLOCKED) && !(s_block & ZONE_BLOCKED))) #ifdef ZASDBG if(verbose) world << "[d] is zone blocked." //dbg(zone_blocked, d) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index c65698933c0..564910d3df2 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -922,30 +922,6 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl refined_trg -= B continue moving - var/list/doors = new/list() - - if(toupdate.len) - for(var/turf/simulated/T1 in toupdate) - for(var/obj/machinery/door/D2 in T1) - doors += D2 - /*if(T1.parent) - air_master.groups_to_rebuild += T1.parent - else - air_master.tiles_to_update += T1*/ - - if(fromupdate.len) - for(var/turf/simulated/T2 in fromupdate) - for(var/obj/machinery/door/D2 in T2) - doors += D2 - /*if(T2.parent) - air_master.groups_to_rebuild += T2.parent - else - air_master.tiles_to_update += T2*/ - - for(var/obj/O in doors) - O:update_nearby_tiles(1) - - proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) if(!original) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 29f425d4a3a..5e8e5747c0a 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -227,12 +227,6 @@ if(S.zone) S.zone.rebuild() if(ispath(N, /turf/simulated/floor)) - //if the old turf had a zone, connect the new turf to it as well - Cael - //Adjusted by SkyMarshal 5/10/13 - The air master will handle the addition of the new turf. - //if(zone) - // zone.RemoveTurf(src) - // if(!zone.CheckStatus()) - // zone.SetStatus(ZONE_ACTIVE) var/turf/simulated/W = new N( locate(src.x, src.y, src.z) ) //W.Assimilate_Air() @@ -249,7 +243,7 @@ W.RemoveLattice() if(air_master) - air_master.mark_for_update(src) + air_master.mark_for_update(src) //handle the addition of the new turf. for(var/turf/space/S in range(W,1)) S.update_starlight() @@ -258,10 +252,6 @@ return W else - //if(zone) - // zone.RemoveTurf(src) - // if(!zone.CheckStatus()) - // zone.SetStatus(ZONE_ACTIVE) var/turf/W = new N( locate(src.x, src.y, src.z) ) W.lighting_lumcount += old_lumcount From 2c4783386fb108f37ab844b6ad2bb567ec0cb425 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Wed, 29 Apr 2015 16:11:53 +0100 Subject: [PATCH 16/31] Removes CE's hardhat --- code/modules/client/preferences_gear.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 2431d481093..03a1104905e 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -199,12 +199,6 @@ var/global/list/gear_datums = list() cost = 2 slot = slot_head -/datum/gear/whardhat - display_name = "hardhat, white" - path = /obj/item/clothing/head/hardhat/white - cost = 2 - slot = slot_head - /datum/gear/boater display_name = "hat, boatsman" path = /obj/item/clothing/head/boaterhat From 277103f1cdfb149c08925809a1f2a59f06065e36 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Tue, 28 Apr 2015 23:06:07 -0400 Subject: [PATCH 17/31] Fixes tiny door zones Fixes #8987 by deferring the update of self-zone-blocked turfs until after non-self-zone-block turfs have updated (and thus have valid zones). --- code/ZAS/Controller.dm | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/code/ZAS/Controller.dm b/code/ZAS/Controller.dm index 4ba30f47b36..d8cb87a7407 100644 --- a/code/ZAS/Controller.dm +++ b/code/ZAS/Controller.dm @@ -154,7 +154,18 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun #ifdef ZASDBG var/updated = 0 #endif + + //defer updating of self-zone-blocked turfs until after all other turfs have been updated. + //this hopefully ensures that non-self-zone-blocked turfs adjacent to self-zone-blocked ones + //have valid zones when the self-zone-blocked turfs update. + var/list/deferred = list() + for(var/turf/T in updating) + //check if the turf is self-zone-blocked + if(T.c_airblock(T) & ZONE_BLOCKED) + deferred += T + continue + T.update_air_properties() T.post_update_air_properties() T.needs_air_update = 0 @@ -164,6 +175,15 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun #endif //sleep(1) + for(var/turf/T in deferred) + T.update_air_properties() + T.post_update_air_properties() + T.needs_air_update = 0 + #ifdef ZASDBG + T.overlays -= mark + updated++ + #endif + #ifdef ZASDBG if(updated != updating.len) tick_progress = "[updating.len - updated] tiles left unupdated." @@ -307,7 +327,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun /datum/controller/air_system/proc/mark_edge_sleeping(connection_edge/E) #ifdef ZASDBG - ASSERT(istype(E) + ASSERT(istype(E)) #endif if(E.sleeping) return active_edges.Remove(E) @@ -315,7 +335,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun /datum/controller/air_system/proc/mark_edge_active(connection_edge/E) #ifdef ZASDBG - ASSERT(istype(E) + ASSERT(istype(E)) #endif if(!E.sleeping) return active_edges.Add(E) From a80cb1b44eb481f08424c4a12a7fddda3e3546a3 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Wed, 29 Apr 2015 20:27:39 -0400 Subject: [PATCH 18/31] Fixes edges being lost when zones are merged --- code/ZAS/Zone.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/ZAS/Zone.dm b/code/ZAS/Zone.dm index 7c9c5f32ed2..7bb8afc8c5e 100644 --- a/code/ZAS/Zone.dm +++ b/code/ZAS/Zone.dm @@ -105,6 +105,13 @@ Class Procs: #ifdef ZASDBG T.dbg(merged) #endif + + //rebuild the old zone's edges so that the will be possesed by the new zone + for(var/connection_edge/E in edges) + if(E.contains_zone(into)) + continue //don't need to rebuild this edge + for(var/turf/T in E.connecting_turfs) + air_master.mark_for_update(T) /zone/proc/c_invalidate() invalid = 1 From 03e88ca9a5475469b33123a5bbb0e4b37ff60bc8 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Wed, 29 Apr 2015 20:53:50 -0400 Subject: [PATCH 19/31] Updates locate(/obj/machinery/door/airlock) hack --- code/ZAS/Turf.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/ZAS/Turf.dm b/code/ZAS/Turf.dm index 1b770590e10..ab7360643fe 100644 --- a/code/ZAS/Turf.dm +++ b/code/ZAS/Turf.dm @@ -59,7 +59,8 @@ #endif if(zone) var/zone/z = zone - if(locate(/obj/machinery/door/airlock) in src) //Hacky, but prevents normal airlocks from rebuilding zones all the time + + if(s_block & ZONE_BLOCKED) //Hacky, but prevents normal airlocks from rebuilding zones all the time z.remove(src) else z.rebuild() From cd707d82793ccdfc0671cf77feed3d22300191d4 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Fri, 1 May 2015 00:08:02 -0400 Subject: [PATCH 20/31] Resist verb cleanup Fixes #8922 and cleans up resisting. Moves various code pieces to new procs, subtypes, or other objects where appropriate. --- baystation12.dme | 1 + .../structures/crates_lockers/closets.dm | 66 ++++ code/modules/mob/living/carbon/carbon.dm | 3 +- code/modules/mob/living/carbon/resist.dm | 160 +++++++++ code/modules/mob/living/living.dm | 315 +++--------------- .../simple_animal/borer/borer_captive.dm | 26 +- code/modules/recycling/sortingmachinery.dm | 4 +- 7 files changed, 311 insertions(+), 264 deletions(-) create mode 100644 code/modules/mob/living/carbon/resist.dm diff --git a/baystation12.dme b/baystation12.dme index f6683c342f6..06fe933f756 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1063,6 +1063,7 @@ #include "code\modules\mob\living\carbon\carbon_defines.dm" #include "code\modules\mob\living\carbon\carbon_powers.dm" #include "code\modules\mob\living\carbon\give.dm" +#include "code\modules\mob\living\carbon\resist.dm" #include "code\modules\mob\living\carbon\shock.dm" #include "code\modules\mob\living\carbon\viruses.dm" #include "code\modules\mob\living\carbon\alien\alien.dm" diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 40163e7c780..adf9da47e0a 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -308,3 +308,69 @@ dump_contents() spawn(1) del(src) return 1 + +/obj/structure/closet/proc/req_breakout() + if(opened) + return 0 //Door's open... wait, why are you in it's contents then? + if(!welded) + return 0 //closed but not welded... + return 1 + +/obj/structure/closet/secure_closet/req_breakout() + if(!opened && locked) return 1 + return ..() //It's a secure closet, but isn't locked. + +/obj/structure/closet/proc/mob_breakout(var/mob/living/escapee) + var/breakout_time = 2 //2 minutes by default + + if(!req_breakout()) + return + + //okay, so the closet is either welded or locked... resist!!! + escapee.next_move = world.time + 100 + escapee.last_special = world.time + 100 + escapee << "\red You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)" + + visible_message("The [src] begins to shake violently!") + playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1) + + for(var/i in 1 to (6*breakout_time * 2)) //minutes * 6 * 5seconds * 2 + if(!do_after(escapee, 50)) //5 seconds + return + if(!escapee || escapee.stat || escapee.loc != src) + return //closet/user destroyed OR user dead/unconcious OR user no longer in closet OR closet opened + //Perform the same set of checks as above for weld and lock status to determine if there is even still a point in 'resisting'... + if(!req_breakout()) + return + playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1) + + //Well then break it! + escapee << "You successfully break out!" + visible_message("\the [escapee] successfully broke out of \the [src]!") + break_open() + +/obj/structure/closet/proc/break_open() + welded = 0 + update_icon() + //Do this to prevent contents from being opened into nullspace (read: bluespace) + if(istype(loc, /obj/structure/bigDelivery)) + var/obj/structure/bigDelivery/BD = loc + BD.unwrap() + open() + +/obj/structure/closet/secure_closet/break_open() + desc += " It appears to be broken." + icon_state = icon_off + spawn() + flick(icon_broken, src) + sleep(10) + flick(icon_broken, src) + sleep(10) + broken = 1 + locked = 0 + update_icon() + //Do this to prevent contents from being opened into nullspace (read: bluespace) + if(istype(loc, /obj/structure/bigDelivery)) + var/obj/structure/bigDelivery/BD = loc + BD.unwrap() + open() diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index defe2191bea..7c3599e726d 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -523,4 +523,5 @@ playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) Stun(stun_duration) Weaken(Floor(stun_duration/2)) - return 1 \ No newline at end of file + return 1 + diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm new file mode 100644 index 00000000000..722fbe3f807 --- /dev/null +++ b/code/modules/mob/living/carbon/resist.dm @@ -0,0 +1,160 @@ + +/mob/living/carbon/resist() + //need to allow !canmove, or otherwise neck grabs can't be resisted + //so just check weakened instead. + if(stat || weakened || next_move > world.time) + return + + //drop && roll + if(on_fire) + fire_stacks -= 2 //reduced + Weaken(3) + spin(32,2) + visible_message("[src] rolls on the floor, trying to put themselves out!", \ + "You stop, drop, and roll!") + sleep(30) + if(fire_stacks <= 0) + visible_message("[src] has successfully extinguished themselves!", \ + "You extinguish yourself.") + ExtinguishMob() + return + + if(handcuffed) + spawn() escape_handcuffs() + else if(legcuffed) + spawn() escape_legcuffs() + + ..() + +/mob/living/carbon/proc/escape_handcuffs() + if(!(last_special <= world.time)) return + + next_move = world.time + 100 + last_special = world.time + 100 + + if(can_break_cuffs()) //Don't want to do a lot of logic gating here. + break_handcuffs() + return + + var/obj/item/weapon/handcuffs/HC = handcuffed + + //A default in case you are somehow handcuffed with something that isn't an obj/item/weapon/handcuffs type + var/breakouttime = 1200 + var/displaytime = 2 //Minutes to display in the "this will take X minutes." + //If you are handcuffed with actual handcuffs... Well what do I know, maybe someone will want to handcuff you with toilet paper in the future... + if(istype(HC)) + breakouttime = HC.breakouttime + displaytime = breakouttime / 600 //Minutes + + src << "\red You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" + visible_message("\red [src] attempts to remove \the [HC]!") + + if(do_after(src, breakouttime)) + if(!handcuffed || buckled) + return + visible_message("\red [src] manages to remove the handcuffs!") + src << "\blue You successfully remove \the [handcuffed]." + drop_from_inventory(handcuffed) + +/mob/living/carbon/proc/escape_legcuffs() + if(!(last_special <= world.time)) return + + next_move = world.time + 100 + last_special = world.time + 100 + + if(can_break_cuffs()) //Don't want to do a lot of logic gating here. + break_legcuffs() + return + + var/obj/item/weapon/legcuffs/HC = legcuffed + + //A default in case you are somehow legcuffed with something that isn't an obj/item/weapon/legcuffs type + var/breakouttime = 1200 + var/displaytime = 2 //Minutes to display in the "this will take X minutes." + //If you are legcuffed with actual legcuffs... Well what do I know, maybe someone will want to legcuff you with toilet paper in the future... + if(istype(HC)) + breakouttime = HC.breakouttime + displaytime = breakouttime / 600 //Minutes + + src << "\red You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" + visible_message( "\red [usr] attempts to remove \the [HC]!" ) + + if(do_after(src, breakouttime)) + if(!legcuffed || buckled) + return + visible_message( + "\red [src] manages to remove the legcuffs!", + "\blue You successfully remove \the [legcuffed]." + ) + + drop_from_inventory(legcuffed) + legcuffed = null + update_inv_legcuffed() + +/mob/living/carbon/proc/can_break_cuffs() + if(HULK in mutations) + return 1 + +/mob/living/carbon/proc/break_handcuffs() + src << "\red You attempt to break your handcuffs. (This will take around 5 seconds and you need to stand still)" + visible_message(text("\red [] is trying to break the handcuffs!", src)) + + if(do_after(src, 50)) + if(!handcuffed || buckled) + return + + visible_message( + "\red [src] manages to break the handcuffs!", + "\red You successfully break your handcuffs." + ) + + say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + + del(handcuffed) + handcuffed = null + if(buckled && buckled.buckle_require_restraints) + buckled.unbuckle_mob() + update_inv_handcuffed() + +/mob/living/carbon/proc/break_legcuffs() + src << "\red You attempt to break your legcuffs. (This will take around 5 seconds and you need to stand still)" + visible_message("\red [src] is trying to break the legcuffs!") + + if(do_after(src, 50)) + if(!legcuffed || buckled) + return + + visible_message( + "\red [src] manages to break the legcuffs!", + "\red You successfully break your legcuffs." + ) + + say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + + del(legcuffed) + legcuffed = null + update_inv_legcuffed() + +/mob/living/carbon/human/can_break_cuffs() + if(species.can_shred(src,1)) + return 1 + return ..() + +/mob/living/carbon/escape_buckle() + if(!buckled) return + if(!(last_special <= world.time)) return + + if(!restrained()) + ..() + else + next_move = world.time + 100 + last_special = world.time + 100 + src << "\red You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stand still)" + visible_message("\red [usr] attempts to unbuckle themself!") + + if(do_after(usr, 1200)) + if(!buckled) + return + visible_message("[usr] manages to unbuckle themself!", + "You successfully unbuckle yourself.") + buckled.user_unbuckle_mob(src) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index a792c24275a..78ca8d1f8b5 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -460,284 +460,77 @@ set name = "Resist" set category = "IC" - if(usr.stat || !isliving(usr) || usr.next_move > world.time) + //need to allow !canmove, or otherwise neck grabs can't be resisted + //so just check weakened instead. + if(stat || weakened || next_move > world.time) return - usr.next_move = world.time + 20 - - var/mob/living/L = usr + next_move = world.time + 20 //Getting out of someone's inventory. - if(istype(src.loc,/obj/item/weapon/holder)) - var/obj/item/weapon/holder/H = src.loc //Get our item holder. - var/mob/M = H.loc //Get our mob holder (if any). - - if(istype(M)) - M.drop_from_inventory(H) - M << "[H] wriggles out of your grip!" - src << "You wriggle out of [M]'s grip!" - else if(istype(H.loc,/obj/item)) - src << "You struggle free of [H.loc]." - H.loc = get_turf(H) - - if(istype(M)) - for(var/atom/A in M.contents) - if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder)) - return - - M.status_flags &= ~PASSEMOTES + if(istype(src.loc, /obj/item/weapon/holder)) + escape_inventory(src.loc) return - //Resisting control by an alien mind. - if(istype(src.loc,/mob/living/simple_animal/borer)) - var/mob/living/simple_animal/borer/B = src.loc - var/mob/living/captive_brain/H = src - - H << "You begin doggedly resisting the parasite's control (this will take approximately sixty seconds)." - B.host << "You feel the captive mind of [src] begin to resist your control." - - spawn(rand(200,250)+B.host.brainloss) - - if(!B || !B.controlling) - return - - B.host.adjustBrainLoss(rand(5,10)) - H << "With an immense exertion of will, you regain control of your body!" - B.host << "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you." - - B.detatch() - - verbs -= /mob/living/carbon/proc/release_control - verbs -= /mob/living/carbon/proc/punish_host - verbs -= /mob/living/carbon/proc/spawn_larvae - - return - //resisting grabs (as if it helps anyone...) - if ((!( L.stat ) && !( L.restrained() ))) - var/resisting = 0 - for(var/obj/O in L.requests) - L.requests.Remove(O) - del(O) - resisting++ - for(var/obj/item/weapon/grab/G in usr.grabbed_by) - resisting++ - switch(G.state) - if(GRAB_PASSIVE) - del(G) - if(GRAB_AGGRESSIVE) - if(prob(60)) //same chance of breaking the grab as disarm - L.visible_message("[L] has broken free of [G.assailant]'s grip!") - del(G) - if(GRAB_NECK) - //If the you move when grabbing someone then it's easier for them to break free. Same if the affected mob is immune to stun. - if (((world.time - G.assailant.l_move_time < 30 || !L.stunned) && prob(15)) || prob(3)) - L.visible_message("[L] has broken free of [G.assailant]'s headlock!") - del(G) - if(resisting) - L.visible_message("[L] resists!") - + if (!restrained()) + resist_grab() //unbuckling yourself - if(L.buckled && (L.last_special <= world.time) ) - if(iscarbon(L)) - var/mob/living/carbon/C = L - if( C.handcuffed ) - C.next_move = world.time + 100 - C.last_special = world.time + 100 - C << "\red You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stand still)" - for(var/mob/O in viewers(L)) - O.show_message("\red [usr] attempts to unbuckle themself!", 1) - spawn(0) - if(do_after(usr, 1200)) - if(!C.buckled) - return - for(var/mob/O in viewers(C)) - O.show_message("\red [usr] manages to unbuckle themself!", 1) - C << "\blue You successfully unbuckle yourself." - C.buckled.user_unbuckle_mob(C) - else - L.buckled.user_unbuckle_mob(L) + if(buckled) + spawn() escape_buckle() //Breaking out of a locker? - else if( src.loc && (istype(src.loc, /obj/structure/closet)) ) - var/breakout_time = 2 //2 minutes by default + if( src.loc && (istype(src.loc, /obj/structure/closet)) ) + var/obj/structure/closet/C = loc + spawn() C.mob_breakout(src) - var/obj/structure/closet/C = L.loc - if(C.opened) - return //Door's open... wait, why are you in it's contents then? - if(istype(L.loc, /obj/structure/closet/secure_closet)) - var/obj/structure/closet/secure_closet/SC = L.loc - if(!SC.locked && !SC.welded) - return //It's a secure closet, but isn't locked. Easily escapable from, no need to 'resist' - else - if(!C.welded) - return //closed but not welded... - // else Meh, lets just keep it at 2 minutes for now - // breakout_time++ //Harder to get out of welded lockers than locked lockers +/mob/living/proc/escape_inventory(obj/item/weapon/holder/H) + if(H != src.loc) return + + var/mob/M = H.loc //Get our mob holder (if any). - //okay, so the closet is either welded or locked... resist!!! - usr.next_move = world.time + 100 - L.last_special = world.time + 100 - L << "\red You lean on the back of \the [C] and start pushing the door open. (this will take about [breakout_time] minutes)" - for(var/mob/O in viewers(usr.loc)) - O.show_message("\red The [L.loc] begins to shake violently!", 1) + if(istype(M)) + M.drop_from_inventory(H) + M << "[H] wriggles out of your grip!" + src << "You wriggle out of [M]'s grip!" + else if(istype(H.loc,/obj/item)) + src << "You struggle free of [H.loc]." + H.loc = get_turf(H) + if(istype(M)) + for(var/atom/A in M.contents) + if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder)) + return - spawn(0) - if(do_after(usr,(breakout_time*60*10))) //minutes * 60seconds * 10deciseconds - if(!C || !L || L.stat != CONSCIOUS || L.loc != C || C.opened) //closet/user destroyed OR user dead/unconcious OR user no longer in closet OR closet opened - return + M.status_flags &= ~PASSEMOTES - //Perform the same set of checks as above for weld and lock status to determine if there is even still a point in 'resisting'... - if(istype(L.loc, /obj/structure/closet/secure_closet)) - var/obj/structure/closet/secure_closet/SC = L.loc - if(!SC.locked && !SC.welded) - return - else - if(!C.welded) - return +/mob/living/proc/escape_buckle() + if(buckled) + buckled.user_unbuckle_mob(src) - //Well then break it! - if(istype(usr.loc, /obj/structure/closet/secure_closet)) - var/obj/structure/closet/secure_closet/SC = L.loc - SC.desc = "It appears to be broken." - SC.icon_state = SC.icon_off - flick(SC.icon_broken, SC) - sleep(10) - flick(SC.icon_broken, SC) - sleep(10) - SC.broken = 1 - SC.locked = 0 - SC.update_icon() - usr << "\red You successfully break out!" - for(var/mob/O in viewers(L.loc)) - O.show_message("\red \the [usr] successfully broke out of \the [SC]!", 1) - if(istype(SC.loc, /obj/structure/bigDelivery)) //Do this to prevent contents from being opened into nullspace (read: bluespace) - var/obj/structure/bigDelivery/BD = SC.loc - BD.attack_hand(usr) - SC.open() - else - C.welded = 0 - C.update_icon() - usr << "\red You successfully break out!" - for(var/mob/O in viewers(L.loc)) - O.show_message("\red \the [usr] successfully broke out of \the [C]!", 1) - if(istype(C.loc, /obj/structure/bigDelivery)) //nullspace ect.. read the comment above - var/obj/structure/bigDelivery/BD = C.loc - BD.attack_hand(usr) - C.open() - - //drop && roll or breaking out of handcuffs - else if(iscarbon(L)) - var/mob/living/carbon/CM = L - if(CM.on_fire && CM.canmove) - CM.fire_stacks -= 5 - CM.Weaken(3) - CM.spin(32,2) - CM.visible_message("[CM] rolls on the floor, trying to put themselves out!", \ - "You stop, drop, and roll!") - sleep(30) - if(fire_stacks <= 0) - CM.visible_message("[CM] has successfully extinguished themselves!", \ - "You extinguish yourself.") - ExtinguishMob() - return - if(CM.handcuffed && CM.canmove && (CM.last_special <= world.time)) - CM.next_move = world.time + 100 - CM.last_special = world.time + 100 - - var/can_break_cuffs - if(HULK in usr.mutations) - can_break_cuffs = 1 - else if(istype(CM,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = CM - if(H.species.can_shred(H,1)) - can_break_cuffs = 1 - - if(can_break_cuffs) //Don't want to do a lot of logic gating here. - usr << "\red You attempt to break your handcuffs. (This will take around 5 seconds and you need to stand still)" - for(var/mob/O in viewers(CM)) - O.show_message(text("\red [] is trying to break the handcuffs!", CM), 1) - spawn(0) - if(do_after(CM, 50)) - if(!CM.handcuffed || CM.buckled) - return - for(var/mob/O in viewers(CM)) - O.show_message(text("\red [] manages to break the handcuffs!", CM), 1) - CM << "\red You successfully break your handcuffs." - CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - del(CM.handcuffed) - CM.handcuffed = null - if(buckled && buckled.buckle_require_restraints) - buckled.unbuckle_mob() - CM.update_inv_handcuffed() - else - var/obj/item/weapon/handcuffs/HC = CM.handcuffed - var/breakouttime = 1200 //A default in case you are somehow handcuffed with something that isn't an obj/item/weapon/handcuffs type - var/displaytime = 2 //Minutes to display in the "this will take X minutes." - if(istype(HC)) //If you are handcuffed with actual handcuffs... Well what do I know, maybe someone will want to handcuff you with toilet paper in the future... - breakouttime = HC.breakouttime - displaytime = breakouttime / 600 //Minutes - CM << "\red You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" - for(var/mob/O in viewers(CM)) - O.show_message( "\red [usr] attempts to remove \the [HC]!", 1) - spawn(0) - if(do_after(CM, breakouttime)) - if(!CM.handcuffed || CM.buckled) - return // time leniency for lag which also might make this whole thing pointless but the server - for(var/mob/O in viewers(CM))// lags so hard that 40s isn't lenient enough - Quarxink - O.show_message("\red [CM] manages to remove the handcuffs!", 1) - CM << "\blue You successfully remove \the [CM.handcuffed]." - CM.drop_from_inventory(CM.handcuffed) - - else if(CM.legcuffed && CM.canmove && (CM.last_special <= world.time)) - CM.next_move = world.time + 100 - CM.last_special = world.time + 100 - - var/can_break_cuffs - if(HULK in usr.mutations) - can_break_cuffs = 1 - else if(istype(CM,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = CM - if(H.species.can_shred(H,1)) - can_break_cuffs = 1 - - if(can_break_cuffs) //Don't want to do a lot of logic gating here. - usr << "\red You attempt to break your legcuffs. (This will take around 5 seconds and you need to stand still)" - for(var/mob/O in viewers(CM)) - O.show_message(text("\red [] is trying to break the legcuffs!", CM), 1) - spawn(0) - if(do_after(CM, 50)) - if(!CM.legcuffed || CM.buckled) - return - for(var/mob/O in viewers(CM)) - O.show_message(text("\red [] manages to break the legcuffs!", CM), 1) - CM << "\red You successfully break your legcuffs." - CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - del(CM.legcuffed) - CM.legcuffed = null - CM.update_inv_legcuffed() - else - var/obj/item/weapon/legcuffs/HC = CM.legcuffed - var/breakouttime = 1200 //A default in case you are somehow legcuffed with something that isn't an obj/item/weapon/legcuffs type - var/displaytime = 2 //Minutes to display in the "this will take X minutes." - if(istype(HC)) //If you are legcuffed with actual legcuffs... Well what do I know, maybe someone will want to legcuff you with toilet paper in the future... - breakouttime = HC.breakouttime - displaytime = breakouttime / 600 //Minutes - CM << "\red You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" - for(var/mob/O in viewers(CM)) - O.show_message( "\red [usr] attempts to remove \the [HC]!", 1) - spawn(0) - if(do_after(CM, breakouttime)) - if(!CM.legcuffed || CM.buckled) - return // time leniency for lag which also might make this whole thing pointless but the server - for(var/mob/O in viewers(CM))// lags so hard that 40s isn't lenient enough - Quarxink - O.show_message("\red [CM] manages to remove the legcuffs!", 1) - CM << "\blue You successfully remove \the [CM.legcuffed]." - CM.drop_from_inventory(CM.legcuffed) - CM.legcuffed = null - CM.update_inv_legcuffed() +/mob/living/proc/resist_grab() + var/resisting = 0 + for(var/obj/O in requests) + requests.Remove(O) + del(O) + resisting++ + for(var/obj/item/weapon/grab/G in grabbed_by) + resisting++ + switch(G.state) + if(GRAB_PASSIVE) + del(G) + if(GRAB_AGGRESSIVE) + if(prob(60)) //same chance of breaking the grab as disarm + visible_message("[src] has broken free of [G.assailant]'s grip!") + del(G) + if(GRAB_NECK) + //If the you move when grabbing someone then it's easier for them to break free. Same if the affected mob is immune to stun. + if (((world.time - G.assailant.l_move_time < 30 || !stunned) && prob(15)) || prob(3)) + visible_message("[src] has broken free of [G.assailant]'s headlock!") + del(G) + if(resisting) + visible_message("[src] resists!") /mob/living/verb/lay_down() set name = "Rest" diff --git a/code/modules/mob/living/simple_animal/borer/borer_captive.dm b/code/modules/mob/living/simple_animal/borer/borer_captive.dm index eacc0589452..79e78b4d5e7 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_captive.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_captive.dm @@ -32,4 +32,28 @@ M << "The captive mind of [src] whispers, \"[message]\"" /mob/living/captive_brain/emote(var/message) - return \ No newline at end of file + return + +/mob/living/captive_brain/resist() + //Resisting control by an alien mind. + if(istype(src.loc,/mob/living/simple_animal/borer)) + var/mob/living/simple_animal/borer/B = src.loc + var/mob/living/captive_brain/H = src + + H << "You begin doggedly resisting the parasite's control (this will take approximately sixty seconds)." + B.host << "You feel the captive mind of [src] begin to resist your control." + + spawn(rand(200,250)+B.host.brainloss) + if(!B || !B.controlling) return + + B.host.adjustBrainLoss(rand(5,10)) + H << "With an immense exertion of will, you regain control of your body!" + B.host << "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you." + B.detatch() + verbs -= /mob/living/carbon/proc/release_control + verbs -= /mob/living/carbon/proc/punish_host + verbs -= /mob/living/carbon/proc/spawn_larvae + + return + + ..() diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 5b375ed8f7d..d7ef079ef90 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -15,13 +15,15 @@ var/tag_x attack_hand(mob/user as mob) + unwrap() + + proc/unwrap() if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 wrapped.loc = (get_turf(src.loc)) if(istype(wrapped, /obj/structure/closet)) var/obj/structure/closet/O = wrapped O.welded = 0 del(src) - return attackby(obj/item/W as obj, mob/user as mob) if(istype(W, /obj/item/device/destTagger)) From 98a4f54b88e00661dbe0126858936f286427b2ff Mon Sep 17 00:00:00 2001 From: mwerezak Date: Fri, 1 May 2015 00:27:58 -0400 Subject: [PATCH 21/31] Adds span classes, moves secure closet procs --- .../structures/crates_lockers/closets.dm | 23 +------- .../closets/secure/secure_closets.dm | 22 +++++++ code/modules/mob/living/carbon/resist.dm | 58 ++++++++++++------- code/modules/mob/living/living.dm | 6 +- 4 files changed, 62 insertions(+), 47 deletions(-) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index adf9da47e0a..fc60729c4c6 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -316,10 +316,6 @@ return 0 //closed but not welded... return 1 -/obj/structure/closet/secure_closet/req_breakout() - if(!opened && locked) return 1 - return ..() //It's a secure closet, but isn't locked. - /obj/structure/closet/proc/mob_breakout(var/mob/living/escapee) var/breakout_time = 2 //2 minutes by default @@ -329,7 +325,7 @@ //okay, so the closet is either welded or locked... resist!!! escapee.next_move = world.time + 100 escapee.last_special = world.time + 100 - escapee << "\red You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)" + escapee << "You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)" visible_message("The [src] begins to shake violently!") playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1) @@ -357,20 +353,3 @@ var/obj/structure/bigDelivery/BD = loc BD.unwrap() open() - -/obj/structure/closet/secure_closet/break_open() - desc += " It appears to be broken." - icon_state = icon_off - spawn() - flick(icon_broken, src) - sleep(10) - flick(icon_broken, src) - sleep(10) - broken = 1 - locked = 0 - update_icon() - //Do this to prevent contents from being opened into nullspace (read: bluespace) - if(istype(loc, /obj/structure/bigDelivery)) - var/obj/structure/bigDelivery/BD = loc - BD.unwrap() - open() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index a3b9f399281..df2985c42ea 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -132,3 +132,25 @@ overlays += "welded" else icon_state = icon_opened + + +/obj/structure/closet/secure_closet/req_breakout() + if(!opened && locked) return 1 + return ..() //It's a secure closet, but isn't locked. + +/obj/structure/closet/secure_closet/break_open() + desc += " It appears to be broken." + icon_state = icon_off + spawn() + flick(icon_broken, src) + sleep(10) + flick(icon_broken, src) + sleep(10) + broken = 1 + locked = 0 + update_icon() + //Do this to prevent contents from being opened into nullspace (read: bluespace) + if(istype(loc, /obj/structure/bigDelivery)) + var/obj/structure/bigDelivery/BD = loc + BD.unwrap() + open() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm index 722fbe3f807..775ef920e8b 100644 --- a/code/modules/mob/living/carbon/resist.dm +++ b/code/modules/mob/living/carbon/resist.dm @@ -10,12 +10,16 @@ fire_stacks -= 2 //reduced Weaken(3) spin(32,2) - visible_message("[src] rolls on the floor, trying to put themselves out!", \ - "You stop, drop, and roll!") + visible_message( + "[src] rolls on the floor, trying to put themselves out!", + "You stop, drop, and roll!" + ) sleep(30) if(fire_stacks <= 0) - visible_message("[src] has successfully extinguished themselves!", \ - "You extinguish yourself.") + visible_message( + "[src] has successfully extinguished themselves!", + "You extinguish yourself." + ) ExtinguishMob() return @@ -46,14 +50,18 @@ breakouttime = HC.breakouttime displaytime = breakouttime / 600 //Minutes - src << "\red You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" - visible_message("\red [src] attempts to remove \the [HC]!") + visible_message( + "[src] attempts to remove \the [HC]!", + "You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" + ) if(do_after(src, breakouttime)) if(!handcuffed || buckled) return - visible_message("\red [src] manages to remove the handcuffs!") - src << "\blue You successfully remove \the [handcuffed]." + visible_message( + "[src] manages to remove \the [handcuffed]!", + "You successfully remove \the [handcuffed]." + ) drop_from_inventory(handcuffed) /mob/living/carbon/proc/escape_legcuffs() @@ -76,15 +84,17 @@ breakouttime = HC.breakouttime displaytime = breakouttime / 600 //Minutes - src << "\red You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" - visible_message( "\red [usr] attempts to remove \the [HC]!" ) + visible_message( + "[usr] attempts to remove \the [HC]!", + "You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" + ) if(do_after(src, breakouttime)) if(!legcuffed || buckled) return visible_message( - "\red [src] manages to remove the legcuffs!", - "\blue You successfully remove \the [legcuffed]." + "[src] manages to remove \the [legcuffed]!", + "You successfully remove \the [legcuffed]." ) drop_from_inventory(legcuffed) @@ -96,16 +106,18 @@ return 1 /mob/living/carbon/proc/break_handcuffs() - src << "\red You attempt to break your handcuffs. (This will take around 5 seconds and you need to stand still)" - visible_message(text("\red [] is trying to break the handcuffs!", src)) + visible_message( + "[src] is trying to break \the [handcuffed]!", + "You attempt to break your [handcuffed.name]. (This will take around 5 seconds and you need to stand still)" + ) if(do_after(src, 50)) if(!handcuffed || buckled) return visible_message( - "\red [src] manages to break the handcuffs!", - "\red You successfully break your handcuffs." + "[src] manages to break \the [handcuffed]!", + "You successfully break your [handcuffed.name]." ) say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) @@ -117,16 +129,16 @@ update_inv_handcuffed() /mob/living/carbon/proc/break_legcuffs() - src << "\red You attempt to break your legcuffs. (This will take around 5 seconds and you need to stand still)" - visible_message("\red [src] is trying to break the legcuffs!") + src << "You attempt to break your legcuffs. (This will take around 5 seconds and you need to stand still)" + visible_message("[src] is trying to break the legcuffs!") if(do_after(src, 50)) if(!legcuffed || buckled) return visible_message( - "\red [src] manages to break the legcuffs!", - "\red You successfully break your legcuffs." + "[src] manages to break the legcuffs!", + "You successfully break your legcuffs." ) say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) @@ -149,8 +161,10 @@ else next_move = world.time + 100 last_special = world.time + 100 - src << "\red You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stand still)" - visible_message("\red [usr] attempts to unbuckle themself!") + visible_message( + "[usr] attempts to unbuckle themself!", + "You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stand still)" + ) if(do_after(usr, 1200)) if(!buckled) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 78ca8d1f8b5..cb36ac853e4 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -492,10 +492,10 @@ if(istype(M)) M.drop_from_inventory(H) - M << "[H] wriggles out of your grip!" - src << "You wriggle out of [M]'s grip!" + M << "[H] wriggles out of your grip!" + src << "You wriggle out of [M]'s grip!" else if(istype(H.loc,/obj/item)) - src << "You struggle free of [H.loc]." + src << "You struggle free of [H.loc]." H.loc = get_turf(H) if(istype(M)) From 8b32d2356eb9bef788798a7a9524a44223825616 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Fri, 1 May 2015 01:21:04 -0400 Subject: [PATCH 22/31] Fixes #9044 Apparently stunned ticks down after grabs are updated. --- code/modules/mob/mob_grab.dm | 2 +- html/changelogs/HarpyEagle-NeckgrabFix.yml | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 html/changelogs/HarpyEagle-NeckgrabFix.yml diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 2b47227dfee..2d26f3b6056 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -96,7 +96,7 @@ affecting.loc = assailant.loc if(state >= GRAB_NECK) - affecting.Stun(1) + affecting.Stun(3) if(isliving(affecting)) var/mob/living/L = affecting L.adjustOxyLoss(1) diff --git a/html/changelogs/HarpyEagle-NeckgrabFix.yml b/html/changelogs/HarpyEagle-NeckgrabFix.yml new file mode 100644 index 00000000000..6ff399b77e3 --- /dev/null +++ b/html/changelogs/HarpyEagle-NeckgrabFix.yml @@ -0,0 +1,5 @@ +author: HarpyEagle +delete-after: True + +changes: + - bugfix: "Neck-grabbing someone now stuns them properly." From b34e44ab847aed5844ebfef7c427190fe65c1422 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Fri, 1 May 2015 08:54:05 +0200 Subject: [PATCH 23/31] Mice are now numbered. You are not a man. This should also make things easier for admins. --- .../mob/living/simple_animal/friendly/mouse.dm | 12 ++++++++++-- html/changelogs/PsiOmegaDelta-OfMiceAndMen.yml | 5 +++++ 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 html/changelogs/PsiOmegaDelta-OfMiceAndMen.yml diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 5b207ce2a73..ad41fc28aad 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -56,7 +56,10 @@ verbs += /mob/living/proc/ventcrawl verbs += /mob/living/proc/hide - name = "[name] ([rand(1, 1000)])" + if(name == initial(name)) + name = "[name] ([rand(1, 1000)])" + real_name = name + if(!body_color) body_color = pick( list("brown","gray","white") ) icon_state = "mouse_[body_color]" @@ -112,5 +115,10 @@ name = "Tom" desc = "Jerry the cat is not amused." +/mob/living/simple_animal/mouse/brown/Tom/New() + ..() + // Change my name back, don't want to be named Tom (666) + name = initial(name) + /mob/living/simple_animal/mouse/can_use_vents() - return \ No newline at end of file + return diff --git a/html/changelogs/PsiOmegaDelta-OfMiceAndMen.yml b/html/changelogs/PsiOmegaDelta-OfMiceAndMen.yml new file mode 100644 index 00000000000..0a994dfbc4c --- /dev/null +++ b/html/changelogs/PsiOmegaDelta-OfMiceAndMen.yml @@ -0,0 +1,5 @@ +author: PsiOmegaDelta +delete-after: True + +changes: + - tweak: "Mice are now numbered to aid admins." From 691931cfc18535d764a4b9cf8245341667436e50 Mon Sep 17 00:00:00 2001 From: Ravensdale Date: Fri, 1 May 2015 05:48:08 -0700 Subject: [PATCH 24/31] Fix animation error with dir 4 droid leg --- icons/mob/robots.dmi | Bin 155583 -> 155537 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index 777f68c62e6f10f6b587c24c9e7a02387ff3aa06..e27dcab96d60daf40c3a1ca0ccfea70a27de7a90 100644 GIT binary patch delta 49035 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 N#s+5k)t8*({vQict~&q# delta 49123 zcmafb2RM~~|NjvgQC3CSBTBN8onureMUs%RO0q|VjN2aBWM!oivWt*$?2(-$d+%iL zvYkfrGsBkzc&mxlC1O(aHHN<&Tj&aJ$ z-p}0MTOB_y!ZIGKNFb zUy@(X1eaHaOuO0ppWMuUUiAz8kCYF*aZQ6jdRaney*LlaU2ixwKF6`*#95VpO@6me z!frwB8z#>75M@YJ&u*{G9|5iA)@)ef6ssY&elk5=3OI7Z_fYvx^|IXpULyTf2QPS zK79DFT<3aVV4&yVl7G7yi;hOLaXX0;9hu^PzS6`Of8|cvmQ9~*dvl4p@1g63JRIRA zBDXWSn5?_d3&7s5M4CrXKg{oSyzW6pByA3l6As`aIk^1w^+X{3bw{;gZF@#BW_ z0+o{T|GX+@`zu$jj7>BI!$l}qSqWm^W@J#zb|m}sEwb(Hw>(hzA2$%FIX^#Nv$HxW zdgJL2UW4bocQKgoCZ8`)I!)j=DSKewkox}j?FG`SsH@Wub~_PnF)@bj?(TT8$43SR z2gg^PyLx&qPHnUNVCA&39*!d>k_aF!=C{nulH2qaI}UhKo}102v`s#`#Wx#SD%Zj* z%_Yp$*d!G;{w8jX?zpys!kd6Y!(BIVA~Io z5`@+;{$}Np*WPdPrxGYW_Zn znZXZ8TKyio>A)92o&QrK_x;@BqOzJ=OVO_u)s<+=ueySc-!-I={r!EHqsQ1}#MMaC9*$#r z5drkNXf@%Iw2@EPUL@~dSNQ%O!X?B%+o_jG)KKCbm|pDq#U4(<+T`_EZ*KGD>zEkh z_BWRT!^0`+L_|)9+DWl0vR&jPZI-#mPk28p+Oo#P!V+9jA?HC?^z|z_a+T|Caq)?R zg9Bs-n;~1!(Hlf`{6-2F>ew;b*GB<2Q&m;vGLD5?SzBA9V_~7j;6vxI18lmp3pD5X z|9zDj|9)csTxjY7HV)tY30pHg<(Bs>ZN^emlqlm>bfZ+X&$`lO-Ry5#0Q&^SXnCY^ zh;Xnk9o<3}``B0lNwlB-eu6pl8hrh>k_ZV8_j#-btNv%WJZ`YuNtgn2zr?tTpSgV#L*_=>>&zT_D2t$ z#}6Ni@8Xe`KE)SJHMOkjy`Ztl|8`H~fN0+kR18K*^>gRXGHHdn~fewUw5+tSjKnV+ws zqCzobBl)eo{I<5XZ+_L@k?ZLU0x?HSO-+BpeUvz_nlRIl)TDu)!~t{Hsx2y?M}lgq}pT+?U01_?JcT zX}AmBVv7@SwYss0->{9!)2HV)US9tE<%|95#8rcD�b0eX4o(`0uaQES^EvMa2?m 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%0DX4%D4Ut!$m^3@Cm`YfYA2F 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�!0DngLz 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 From 3509178aa8a4b46a1f6dad3d1345c342be92dcb4 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Fri, 1 May 2015 15:13:07 -0400 Subject: [PATCH 25/31] More resist refactoring Reorganizes resist a bit more to allow for cleaner inheritance. --- code/modules/mob/living/carbon/resist.dm | 6 +----- code/modules/mob/living/living.dm | 15 +++++++++++---- .../living/simple_animal/borer/borer_captive.dm | 5 ++++- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm index 775ef920e8b..95ee36b1f6b 100644 --- a/code/modules/mob/living/carbon/resist.dm +++ b/code/modules/mob/living/carbon/resist.dm @@ -1,9 +1,5 @@ -/mob/living/carbon/resist() - //need to allow !canmove, or otherwise neck grabs can't be resisted - //so just check weakened instead. - if(stat || weakened || next_move > world.time) - return +/mob/living/carbon/process_resist() //drop && roll if(on_fire) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index cb36ac853e4..3bf702b872f 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -460,13 +460,20 @@ set name = "Resist" set category = "IC" + if(can_resist()) + next_move = world.time + 20 + process_resist() + +/mob/living/proc/can_resist() //need to allow !canmove, or otherwise neck grabs can't be resisted //so just check weakened instead. - if(stat || weakened || next_move > world.time) - return - - next_move = world.time + 20 + if(stat || weakened) + return 0 + if(next_move > world.time) + return 0 + return 1 +/mob/living/proc/process_resist() //Getting out of someone's inventory. if(istype(src.loc, /obj/item/weapon/holder)) escape_inventory(src.loc) diff --git a/code/modules/mob/living/simple_animal/borer/borer_captive.dm b/code/modules/mob/living/simple_animal/borer/borer_captive.dm index 79e78b4d5e7..25cc18cdd26 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_captive.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_captive.dm @@ -34,7 +34,10 @@ /mob/living/captive_brain/emote(var/message) return -/mob/living/captive_brain/resist() +/mob/living/captive_brain/can_resist() + return !(stat || next_move > world.time) + +/mob/living/captive_brain/process_resist() //Resisting control by an alien mind. if(istype(src.loc,/mob/living/simple_animal/borer)) var/mob/living/simple_animal/borer/B = src.loc From b10c64d48bc897efbaaaed285d71f7e6baf60a01 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Fri, 1 May 2015 16:15:17 -0400 Subject: [PATCH 26/31] Adds a closet breakout animation, fixes spamming the breakout proc --- .../structures/crates_lockers/closets.dm | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index fc60729c4c6..8b46abee496 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -10,7 +10,7 @@ var/welded = 0 var/wall_mounted = 0 //never solid (You can always pass over it) var/health = 100 - var/lastbang + var/breakout = 0 //if someone is currently breaking out. mutex var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate //then open it in a populated area to crash clients. var/open_sound = 'sound/machines/click.ogg' @@ -255,12 +255,6 @@ if(!src.open()) user << "It won't budge!" - if(!lastbang) - lastbang = 1 - for (var/mob/M in hearers(src, null)) - M << text("BANG, bang!", max(0, 5 - get_dist(src, M))) - spawn(30) - lastbang = 0 /obj/structure/closet/attack_hand(mob/user as mob) src.add_fingerprint(user) @@ -310,6 +304,8 @@ return 1 /obj/structure/closet/proc/req_breakout() + if(breakout) + return 0 //Already breaking out. if(opened) return 0 //Door's open... wait, why are you in it's contents then? if(!welded) @@ -328,22 +324,30 @@ escapee << "You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)" visible_message("The [src] begins to shake violently!") - playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1) + breakout = 1 //can't think of a better way to do this right now. for(var/i in 1 to (6*breakout_time * 2)) //minutes * 6 * 5seconds * 2 + playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1) + animate_shake() + if(!do_after(escapee, 50)) //5 seconds + breakout = 0 return if(!escapee || escapee.stat || escapee.loc != src) + breakout = 0 return //closet/user destroyed OR user dead/unconcious OR user no longer in closet OR closet opened //Perform the same set of checks as above for weld and lock status to determine if there is even still a point in 'resisting'... if(!req_breakout()) + breakout = 0 return - playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1) //Well then break it! + breakout = 0 escapee << "You successfully break out!" visible_message("\the [escapee] successfully broke out of \the [src]!") + playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1) break_open() + animate_shake() /obj/structure/closet/proc/break_open() welded = 0 @@ -353,3 +357,9 @@ var/obj/structure/bigDelivery/BD = loc BD.unwrap() open() + +/obj/structure/closet/proc/animate_shake() + var/init_px = pixel_x + var/shake_dir = pick(-1, 1) + animate(src, transform=turn(matrix(), 8*shake_dir), pixel_x=init_px + 2*shake_dir, time=1) + animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING) From 6238dabf888f9fd7cc54fc7b3a78ef058ac66015 Mon Sep 17 00:00:00 2001 From: Loganbacca Date: Sat, 2 May 2015 13:33:25 +1200 Subject: [PATCH 27/31] Chem smoke fadeOut sanity checks Ported updates from /tg/ to fadeOut code. Updates written by vista- --- code/game/objects/effects/chemsmoke.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/game/objects/effects/chemsmoke.dm b/code/game/objects/effects/chemsmoke.dm index e64a84c47c3..357996351d6 100644 --- a/code/game/objects/effects/chemsmoke.dm +++ b/code/game/objects/effects/chemsmoke.dm @@ -229,6 +229,10 @@ // Fades out the smoke smoothly using it's alpha variable. //------------------------------------------ /datum/effect/effect/system/smoke_spread/chem/proc/fadeOut(var/atom/A, var/frames = 16) + if(A.alpha == 0) //Handle already transparent case + return + if(frames == 0) + frames = 1 //We will just assume that by 0 frames, the coder meant "during one frame". var/step = A.alpha / frames for(var/i = 0, i < frames, i++) A.alpha -= step From 6123c8421eba1b2443a40994a89560aef766296e Mon Sep 17 00:00:00 2001 From: RavingManiac Date: Mon, 4 May 2015 16:58:24 +1000 Subject: [PATCH 28/31] Intent menu appears on zoom --- code/_onclick/hud/hud.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index e9c5429dd2a..22253450b75 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -259,11 +259,11 @@ datum/hud/New(mob/owner) if(!hud_used) usr << "\red This mob type does not use a HUD." return - + if(!ishuman(src)) usr << "\red Inventory hiding is currently only supported for human mobs, sorry." return - + if(!client) return if(client.view != world.view) return @@ -325,7 +325,7 @@ datum/hud/New(mob/owner) return if(client.view != world.view) return - + if(hud_used.hud_shown) hud_used.hud_shown = 0 if(src.hud_used.adding) @@ -337,6 +337,7 @@ datum/hud/New(mob/owner) if(src.hud_used.item_action_list) src.client.screen -= src.hud_used.item_action_list src.client.screen -= src.internals + src.client.screen += src.hud_used.action_intent //we want the intent swticher visible else hud_used.hud_shown = 1 if(src.hud_used.adding) From a35f2c0ad6f16a6d2059ef1280cdb15aedd3400d Mon Sep 17 00:00:00 2001 From: RavingManiac Date: Mon, 4 May 2015 17:03:37 +1000 Subject: [PATCH 29/31] Changelog update --- html/changelogs/RavingManiac-master.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/html/changelogs/RavingManiac-master.yml b/html/changelogs/RavingManiac-master.yml index 9d3ea70147b..e3a031deecb 100644 --- a/html/changelogs/RavingManiac-master.yml +++ b/html/changelogs/RavingManiac-master.yml @@ -2,4 +2,5 @@ author: RavingManiac delete-after: True changes: - - tweak: "Candles now burn for about 30 mintutes." + - tweak: "Candles now burn for about 30 minutes." + - tweak: "Intent menu now appears while zooming with a sniper rifle." From 7ff68f8757f0d6d6c1dbcc823b1abc943331e647 Mon Sep 17 00:00:00 2001 From: volas Date: Mon, 4 May 2015 12:10:59 +0300 Subject: [PATCH 30/31] Modification to 'cinematic' command --- code/modules/admin/verbs/cinematic.dm | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm index e21de8641d7..a643b370fc4 100644 --- a/code/modules/admin/verbs/cinematic.dm +++ b/code/modules/admin/verbs/cinematic.dm @@ -1,12 +1,17 @@ /client/proc/cinematic(var/cinematic as anything in list("explosion",null)) - set name = "cinematic" + set name = "Cinematic" set category = "Fun" set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted. - set hidden = 1 + + if(!check_rights(R_FUN)) + return + if(alert("Are you sure you want to run [cinematic]?","Confirmation","Yes","No")=="No") return if(!ticker) return switch(cinematic) if("explosion") + if(alert("The game will be over. Are you really sure?", "Confirmation" ,"Continue", "Cancel") == "Cancel") + return var/parameter = input(src,"station_missed = ?","Enter Parameter",0) as num var/override switch(parameter) @@ -15,4 +20,8 @@ if(0) override = input(src,"mode = ?","Enter Parameter",null) as anything in list("blob","mercenary","AI malfunction","no override") ticker.station_explosion_cinematic(parameter,override) + + log_admin("[key_name(src)] launched cinematic \"[cinematic]\"") + message_admins("[key_name_admin(src)] launched cinematic \"[cinematic]\"", 1) + return \ No newline at end of file From 33dde892e25bd75947f7b06ff5c5ee9ec10e4653 Mon Sep 17 00:00:00 2001 From: Kelenius Date: Mon, 4 May 2015 21:33:30 +0300 Subject: [PATCH 31/31] Fixes a few log-destroying lines --- code/game/gamemodes/gameticker.dm | 2 +- code/game/mecha/equipment/tools/tools.dm | 2 +- code/game/objects/effects/spiders.dm | 4 ++-- code/modules/mob/living/carbon/human/examine.dm | 8 ++++---- code/modules/projectiles/gun.dm | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index ad624aec9b5..49b4b4ac985 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -432,7 +432,7 @@ var/global/datum/controller/gameticker/ticker robo.laws.show_laws(world) if(dronecount) - world << "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] at the end of this round." + world << "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] at the end of this round." mode.declare_completion()//To declare normal completion. diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 130d8d89c81..b124c4c2263 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -440,7 +440,7 @@ last_fired = world.time else if (world.time % 3) - occupant_message("[src] is not ready to fire again!") + occupant_message("[src] is not ready to fire again!") return 0 switch(mode) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 682347669a7..60e3f1b44f0 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -22,9 +22,9 @@ /obj/effect/spider/attackby(var/obj/item/weapon/W, var/mob/user) if(W.attack_verb.len) - visible_message("\red \The [src] have been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") + visible_message("\The [src] have been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") else - visible_message("\red \The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]") + visible_message("\The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]") var/damage = W.force / 4.0 diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 3630d609a34..007f5a35522 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -384,14 +384,14 @@ else if(is_bleeding["right foot"]) display_shoes = 1 if(display_chest) - msg += "[src] has blood soaking through from under [t_his] clothing!\n" + msg += "[src] has blood soaking through from under [t_his] clothing!\n" if(display_shoes) - msg += "[src] has blood running from [t_his] shoes!\n" + msg += "[src] has blood running from [t_his] shoes!\n" if(display_gloves) - msg += "[src] has blood running from under [t_his] gloves!\n" + msg += "[src] has blood running from under [t_his] gloves!\n" for(var/implant in get_visible_implants(0)) - msg += "[src] has \a [implant] sticking out of [t_his] flesh!\n" + msg += "[src] has \a [implant] sticking out of [t_his] flesh!\n" if(digitalcamo) msg += "[t_He] [t_is] repulsively uncanny!\n" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 4e81f77e96c..9dceb44fb4b 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -124,7 +124,7 @@ if (!ready_to_fire()) if (world.time % 3) //to prevent spam - user << "[src] is not ready to fire again!" + user << "[src] is not ready to fire again!" return var/obj/projectile = consume_next_projectile(user) @@ -170,7 +170,7 @@ if(reflex) user.visible_message( - "[user] fires [src][pointblank ? " point blank at [target]":""] by reflex!", + "[user] fires [src][pointblank ? " point blank at [target]":""] by reflex!", "You fire [src] by reflex]!", "You hear a [fire_sound_text]!" )