diff --git a/.drone.yml b/.drone.yml index 35cd0b7072b..2feb88860a9 100644 --- a/.drone.yml +++ b/.drone.yml @@ -39,6 +39,7 @@ steps: - cd vueui - npm install # TODO: Cache that shit - (npm run lint | tee lint.log) + - grep "No lint errors found!" lint.log - npm run build --- kind: pipeline @@ -139,6 +140,6 @@ steps: - echo "Unit Tests Completed" --- kind: signature -hmac: 21286f11eaa90a42d926886ecc2df9312ad174051f5f42b51d4394cc578ae0ee +hmac: 789040126b8c141504b44f8489c7d7c8dca93c7539270de6b2b67fd835061c9e ... diff --git a/aurorastation.dme b/aurorastation.dme index 0c60af6bc81..17e4de24ace 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -1360,6 +1360,7 @@ #include "code\modules\client\preference_setup\loadout\loadout_suit.dm" #include "code\modules\client\preference_setup\loadout\loadout_uniform.dm" #include "code\modules\client\preference_setup\loadout\loadout_utility.dm" +#include "code\modules\client\preference_setup\loadout\loadout_wrists.dm" #include "code\modules\client\preference_setup\loadout\loadout_xeno.dm" #include "code\modules\client\preference_setup\loadout\loadout_xeno\human.dm" #include "code\modules\client\preference_setup\loadout\loadout_xeno\machine.dm" @@ -1489,6 +1490,8 @@ #include "code\modules\clothing\under\xenos\tajara.dm" #include "code\modules\clothing\under\xenos\unathi.dm" #include "code\modules\clothing\under\xenos\vaurca.dm" +#include "code\modules\clothing\wrists\watches.dm" +#include "code\modules\clothing\wrists\wrists.dm" #include "code\modules\cooking\trays.dm" #include "code\modules\cooking\machinery\gibber.dm" #include "code\modules\cooking\machinery\icecream.dm" diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm index 54bb896bc5c..aaef3ed1617 100644 --- a/code/__defines/items_clothing.dm +++ b/code/__defines/items_clothing.dm @@ -3,22 +3,23 @@ #define CANDLE_LUM 3 // For how bright candles are. // Item inventory slot bitmasks. -#define SLOT_OCLOTHING 0x1 -#define SLOT_ICLOTHING 0x2 -#define SLOT_GLOVES 0x4 -#define SLOT_EYES 0x8 -#define SLOT_EARS 0x10 -#define SLOT_MASK 0x20 -#define SLOT_HEAD 0x40 -#define SLOT_FEET 0x80 -#define SLOT_ID 0x100 -#define SLOT_BELT 0x200 -#define SLOT_BACK 0x400 -#define SLOT_POCKET 0x800 // This is to allow items with a w_class of 3 or 4 to fit in pockets. -#define SLOT_DENYPOCKET 0x1000 // This is to deny items with a w_class of 2 or 1 from fitting in pockets. -#define SLOT_TWOEARS 0x2000 -#define SLOT_TIE 0x4000 -#define SLOT_HOLSTER 0x8000 //16th bit - higher than this will overflow +#define SLOT_OCLOTHING (1<<0) +#define SLOT_ICLOTHING (1<<1) +#define SLOT_GLOVES (1<<2) +#define SLOT_EYES (1<<3) +#define SLOT_EARS (1<<4) +#define SLOT_MASK (1<<5) +#define SLOT_HEAD (1<<6) +#define SLOT_FEET (1<<7) +#define SLOT_ID (1<<8) +#define SLOT_BELT (1<<9) +#define SLOT_BACK (1<<10) +#define SLOT_POCKET (1<<11) // This is to allow items with a w_class of 3 or 4 to fit in pockets. +#define SLOT_DENYPOCKET (1<<12) // This is to deny items with a w_class of 2 or 1 from fitting in pockets. +#define SLOT_TWOEARS (1<<13) +#define SLOT_TIE (1<<14) +#define SLOT_HOLSTER (1<<15) +#define SLOT_WRISTS (1<<16) // Flags bitmasks. #define NOBLUDGEON 0x1 // When an item has this it produces no "X has been hit by Y with Z" message with the default handler. @@ -58,35 +59,39 @@ #define HIDEEARS 0x40 // Headsets and such. #define HIDEEYES 0x80 // Glasses. #define HIDEFACE 0x100// Dictates whether we appear as "Unknown". -#define BLOCKHEADHAIR 0x200// Hides the user's hair overlay. Leaves facial hair. -#define BLOCKHAIR 0x400// Hides the user's hair, facial and otherwise. -#define ALWAYSDRAW 0x800//If set, this item is always rendered even if its slot is hidden by other clothing +#define HIDEWRISTS 0x200 +#define BLOCKHEADHAIR 0x400// Hides the user's hair overlay. Leaves facial hair. +#define BLOCKHAIR 0x800/// Hides the user's hair, facial and otherwise. +#define ALWAYSDRAW 0x1000//If set, this item is always rendered even if its slot is hidden by other clothing //Note that the item may still not be visible if its sprite is actually covered up. // Slots. -#define slot_back 1 -#define slot_wear_mask 2 -#define slot_handcuffed 3 -#define slot_l_hand 4 -#define slot_r_hand 5 -#define slot_belt 6 -#define slot_wear_id 7 -#define slot_l_ear 8 -#define slot_glasses 9 -#define slot_gloves 10 -#define slot_head 11 -#define slot_shoes 12 -#define slot_wear_suit 13 -#define slot_w_uniform 14 -#define slot_l_store 15 -#define slot_r_store 16 -#define slot_s_store 17 -#define slot_in_backpack 18 -#define slot_legcuffed 19 -#define slot_r_ear 20 -#define slot_legs 21 -#define slot_tie 22 -#define slot_in_belt 23 +#define slot_first 1 +#define slot_back 2 +#define slot_wear_mask 3 +#define slot_handcuffed 4 +#define slot_l_hand 5 +#define slot_r_hand 6 +#define slot_belt 7 +#define slot_wear_id 8 +#define slot_l_ear 9 +#define slot_glasses 10 +#define slot_gloves 11 +#define slot_head 12 +#define slot_shoes 13 +#define slot_wear_suit 14 +#define slot_w_uniform 15 +#define slot_l_store 16 +#define slot_r_store 17 +#define slot_s_store 18 +#define slot_in_backpack 19 +#define slot_legcuffed 20 +#define slot_r_ear 21 +#define slot_legs 22 +#define slot_tie 23 +#define slot_in_belt 24 +#define slot_wrists 25 +#define slot_last 26 //for the love of god, keep this updated or you won't be able to unequip things // Inventory slot strings. // since numbers cannot be used as associative list keys. @@ -99,7 +104,8 @@ #define slot_wear_suit_str "slot_suit" #define slot_l_ear_str "slot_l_ear" #define slot_r_ear_str "slot_r_ear" -#define slot_shoes_str "slot_shoes" +#define slot_shoes_str "slot_shoes" +#define slot_wrists_str "slot_wrists" //itemstate suffixes. Used for containedsprite worn items #define WORN_LHAND "_lh" @@ -119,6 +125,7 @@ #define WORN_BACK "_ba" #define WORN_ID "_id" #define WORN_MASK "_ma" +#define WORN_WRISTS "_wr" // Bitflags for clothing parts. #define HEAD 0x1 diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 0daa8464f1c..0e35d176b31 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -207,19 +207,20 @@ #define MAX_SUPPLIED_LAW_NUMBER 50 //default item on-mob icons -#define INV_HEAD_DEF_ICON 'icons/mob/head.dmi' -#define INV_BACK_DEF_ICON 'icons/mob/back.dmi' -#define INV_L_HAND_DEF_ICON 'icons/mob/items/lefthand.dmi' -#define INV_R_HAND_DEF_ICON 'icons/mob/items/righthand.dmi' -#define INV_W_UNIFORM_DEF_ICON 'icons/mob/uniform.dmi' -#define INV_ACCESSORIES_DEF_ICON 'icons/mob/ties.dmi' -#define INV_SUIT_DEF_ICON 'icons/mob/suit.dmi' -#define INV_L_EAR_DEF_ICON 'icons/mob/l_ear.dmi' -#define INV_R_EAR_DEF_ICON 'icons/mob/r_ear.dmi' -#define INV_SHOES_DEF_ICON 'icons/mob/feet.dmi' +#define INV_HEAD_DEF_ICON 'icons/mob/head.dmi' +#define INV_BACK_DEF_ICON 'icons/mob/back.dmi' +#define INV_L_HAND_DEF_ICON 'icons/mob/items/lefthand.dmi' +#define INV_R_HAND_DEF_ICON 'icons/mob/items/righthand.dmi' +#define INV_W_UNIFORM_DEF_ICON 'icons/mob/uniform.dmi' +#define INV_ACCESSORIES_DEF_ICON 'icons/mob/ties.dmi' +#define INV_SUIT_DEF_ICON 'icons/mob/suit.dmi' +#define INV_L_EAR_DEF_ICON 'icons/mob/l_ear.dmi' +#define INV_R_EAR_DEF_ICON 'icons/mob/r_ear.dmi' +#define INV_SHOES_DEF_ICON 'icons/mob/feet.dmi' +#define INV_WRISTS_DEF_ICON 'icons/mob/wrist.dmi' // IPC tags -#define IPC_OWNERSHIP_SELF "Self Owned" +#define IPC_OWNERSHIP_SELF "Self Owned" #define IPC_OWNERSHIP_COMPANY "Company Owned" #define IPC_OWNERSHIP_PRIVATE "Privately Owned" diff --git a/code/_helpers/matrices.dm b/code/_helpers/matrices.dm index 9cb12bf7c2c..f0adc7b2e23 100644 --- a/code/_helpers/matrices.dm +++ b/code/_helpers/matrices.dm @@ -25,6 +25,13 @@ //doesn't have an object argument because this is "Stacking" with the animate call above //3 billion% intentional +/atom/proc/shake_animation(var/intensity = 8) + var/init_px = pixel_x + var/shake_dir = pick(-1, 1) + animate(src, transform=turn(matrix(), intensity*shake_dir), pixel_x=init_px + 2*shake_dir, time=1) + animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING) + return intensity + // Color matrices: //Luma coefficients suggested for HDTVs. If you change these, make sure they add up to 1. @@ -114,4 +121,4 @@ #undef LUMR #undef LUMG -#undef LUMB \ No newline at end of file +#undef LUMB diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 5c3b3f1d5cd..37ea129680e 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -106,11 +106,13 @@ #define ui_glasses "WEST:6,SOUTH+2:9" #define ui_mask "WEST+1:8,SOUTH+2:9" -#define ui_l_ear "WEST+2:10,SOUTH+2:9" -#define ui_r_ear "WEST+2:10,SOUTH+3:11" +#define ui_l_ear "WEST+2:10,SOUTH+3:11" +#define ui_r_ear "WEST:6,SOUTH+3:11" #define ui_head "WEST+1:8,SOUTH+3:11" +#define ui_wrists "WEST+2:10,SOUTH+2:9" + //Intent small buttons #define ui_help_small "EAST-3:8,SOUTH:1" #define ui_disarm_small "EAST-3:15,SOUTH:18" diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 51961f4d993..e8cbf08c352 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -187,44 +187,67 @@ datum/hud/New(mob/owner) if(inventory_shown && hud_shown) switch(hud_data["slot"]) if(slot_head) - if(H.head) H.head.screen_loc = hud_data["loc"] + if(H.head) + H.head.screen_loc = hud_data["loc"] if(slot_shoes) - if(H.shoes) H.shoes.screen_loc = hud_data["loc"] + if(H.shoes) + H.shoes.screen_loc = hud_data["loc"] if(slot_l_ear) - if(H.l_ear) H.l_ear.screen_loc = hud_data["loc"] + if(H.l_ear) + H.l_ear.screen_loc = hud_data["loc"] if(slot_r_ear) - if(H.r_ear) H.r_ear.screen_loc = hud_data["loc"] + if(H.r_ear) + H.r_ear.screen_loc = hud_data["loc"] if(slot_gloves) - if(H.gloves) H.gloves.screen_loc = hud_data["loc"] + if(H.gloves) + H.gloves.screen_loc = hud_data["loc"] if(slot_glasses) - if(H.glasses) H.glasses.screen_loc = hud_data["loc"] + if(H.glasses) + H.glasses.screen_loc = hud_data["loc"] if(slot_w_uniform) - if(H.w_uniform) H.w_uniform.screen_loc = hud_data["loc"] + if(H.w_uniform) + H.w_uniform.screen_loc = hud_data["loc"] if(slot_wear_suit) - if(H.wear_suit) H.wear_suit.screen_loc = hud_data["loc"] + if(H.wear_suit) + H.wear_suit.screen_loc =hud_data["loc"] if(slot_wear_mask) - if(H.wear_mask) H.wear_mask.screen_loc = hud_data["loc"] + if(H.wear_mask) + H.wear_mask.screen_loc =hud_data["loc"] + if(slot_wrists) + if(H.wrists) + H.wrists.screen_loc = hud_data["loc"] else switch(hud_data["slot"]) if(slot_head) - if(H.head) H.head.screen_loc = null + if(H.head) + H.head.screen_loc = null if(slot_shoes) - if(H.shoes) H.shoes.screen_loc = null + if(H.shoes) + H.shoes.screen_loc = null if(slot_l_ear) - if(H.l_ear) H.l_ear.screen_loc = null + if(H.l_ear) + H.l_ear.screen_loc = null if(slot_r_ear) - if(H.r_ear) H.r_ear.screen_loc = null + if(H.r_ear) + H.r_ear.screen_loc = null if(slot_gloves) - if(H.gloves) H.gloves.screen_loc = null + if(H.gloves) + H.gloves.screen_loc = null if(slot_glasses) - if(H.glasses) H.glasses.screen_loc = null + if(H.glasses) + H.glasses.screen_loc = null if(slot_w_uniform) - if(H.w_uniform) H.w_uniform.screen_loc = null + if(H.w_uniform) + H.w_uniform.screen_loc =null if(slot_wear_suit) - if(H.wear_suit) H.wear_suit.screen_loc = null + if(H.wear_suit) + H.wear_suit.screen_loc = null if(slot_wear_mask) - if(H.wear_mask) H.wear_mask.screen_loc = null - + if(H.wear_mask) + H.wear_mask.screen_loc =null + if(slot_wrists) + if(H.wrists) + H.wrists.screen_loc = null /datum/hud/proc/persistant_inventory_update() if(!mymob) @@ -237,31 +260,43 @@ datum/hud/New(mob/owner) if(hud_shown) switch(hud_data["slot"]) if(slot_s_store) - if(H.s_store) H.s_store.screen_loc = hud_data["loc"] + if(H.s_store) + H.s_store.screen_loc = hud_data["loc"] if(slot_wear_id) - if(H.wear_id) H.wear_id.screen_loc = hud_data["loc"] + if(H.wear_id) + H.wear_id.screen_loc = hud_data["loc"] if(slot_belt) - if(H.belt) H.belt.screen_loc = hud_data["loc"] + if(H.belt) + H.belt.screen_loc = hud_data["loc"] if(slot_back) - if(H.back) H.back.screen_loc = hud_data["loc"] + if(H.back) + H.back.screen_loc = hud_data["loc"] if(slot_l_store) - if(H.l_store) H.l_store.screen_loc = hud_data["loc"] + if(H.l_store) + H.l_store.screen_loc = hud_data["loc"] if(slot_r_store) - if(H.r_store) H.r_store.screen_loc = hud_data["loc"] + if(H.r_store) + H.r_store.screen_loc = hud_data["loc"] else switch(hud_data["slot"]) if(slot_s_store) - if(H.s_store) H.s_store.screen_loc = null + if(H.s_store) + H.s_store.screen_loc = null if(slot_wear_id) - if(H.wear_id) H.wear_id.screen_loc = null + if(H.wear_id) + H.wear_id.screen_loc = null if(slot_belt) - if(H.belt) H.belt.screen_loc = null + if(H.belt) + H.belt.screen_loc = null if(slot_back) - if(H.back) H.back.screen_loc = null + if(H.back) + H.back.screen_loc = null if(slot_l_store) - if(H.l_store) H.l_store.screen_loc = null + if(H.l_store) + H.l_store.screen_loc = null if(slot_r_store) - if(H.r_store) H.r_store.screen_loc = null + if(H.r_store) + H.r_store.screen_loc = null /datum/hud/proc/instantiate() @@ -381,4 +416,4 @@ datum/hud/New(mob/owner) client.screen |= click_catchers /mob/abstract/new_player/add_click_catcher() - return \ No newline at end of file + return diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index f14a04ba887..4572fbe19cc 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -31,7 +31,7 @@ inv_box.hud = src var/list/slot_data = hud_data.gear[gear_slot] - inv_box.name = gear_slot + inv_box.name = slot_data["name"] inv_box.screen_loc = slot_data["loc"] inv_box.slot_id = slot_data["slot"] inv_box.icon_state = slot_data["state"] @@ -158,7 +158,7 @@ inv_box = new /obj/screen/inventory/hand() inv_box.hud = src - inv_box.name = BP_R_HAND + inv_box.name = "right hand" inv_box.icon = ui_style inv_box.icon_state = "r_hand_inactive" if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use @@ -174,7 +174,7 @@ inv_box = new /obj/screen/inventory/hand() inv_box.hud = src - inv_box.name = BP_L_HAND + inv_box.name = "left hand" inv_box.icon = ui_style inv_box.icon_state = "l_hand_inactive" if(mymob && mymob.hand) //This being 1 means the left hand is in use @@ -398,7 +398,7 @@ all_underwear.Cut() regenerate_icons() -// Yes, these use icon state. Yes, these are terrible. The alternative is duplicating +// Yes, these use icon state. Yes, these are terrible. The alternative is duplicating // a bunch of fairly blobby logic for every click override on these objects. /obj/screen/food/Click(var/location, var/control, var/params) @@ -441,7 +441,7 @@ if("thirst3") to_chat(usr, SPAN_WARNING("You are quite thirsty.")) if("thirst4") - to_chat(usr, SPAN_DANGER("Your are entirely dehydrated!")) + to_chat(usr, SPAN_DANGER("You are entirely dehydrated!")) /obj/screen/bodytemp/Click(var/location, var/control, var/params) if(istype(usr) && usr.bodytemp == src) @@ -498,4 +498,4 @@ if(usr.paralysis) to_chat(usr, SPAN_WARNING("You are completely paralyzed and cannot move!")) else - to_chat(usr, SPAN_NOTICE("You are walking around completely fine.")) \ No newline at end of file + to_chat(usr, SPAN_NOTICE("You are walking around completely fine.")) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index b6e7b6a25f4..cf986fb07e7 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -379,11 +379,11 @@ if(use_check_and_message(usr, USE_ALLOW_NON_ADJACENT|USE_ALLOW_NON_ADV_TOOL_USR)) //You're always adjacent to your inventory in practice. return TRUE switch(name) - if(BP_R_HAND) + if("right hand") if(iscarbon(usr)) var/mob/living/carbon/C = usr C.activate_hand("r") - if(BP_L_HAND) + if("left hand") if(iscarbon(usr)) var/mob/living/carbon/C = usr C.activate_hand("l") @@ -485,4 +485,4 @@ else if(O && (!O.is_usable() || O.is_malfunctioning())) add_overlay(disabled_hand_overlay) if(H.handcuffed) - add_overlay(handcuff_overlay) \ No newline at end of file + add_overlay(handcuff_overlay) diff --git a/code/datums/outfits/outfit_antag.dm b/code/datums/outfits/outfit_antag.dm index b2719a5059f..d98549c2fb1 100644 --- a/code/datums/outfits/outfit_antag.dm +++ b/code/datums/outfits/outfit_antag.dm @@ -404,10 +404,10 @@ head = null gloves = list( - /obj/item/clothing/gloves/watch, - /obj/item/clothing/gloves/watch/silver, - /obj/item/clothing/gloves/watch/gold, - /obj/item/clothing/gloves/watch/spy + /obj/item/clothing/wrists/watch, + /obj/item/clothing/wrists/watch/silver, + /obj/item/clothing/wrists/watch/gold, + /obj/item/clothing/wrists/watch/spy ) l_ear = /obj/item/device/radio/headset/burglar diff --git a/code/datums/trading/goods.dm b/code/datums/trading/goods.dm index 68e98b62112..913d6a44a56 100644 --- a/code/datums/trading/goods.dm +++ b/code/datums/trading/goods.dm @@ -182,7 +182,7 @@ /obj/item/clothing/gloves/chameleon = TRADER_BLACKLIST, /obj/item/clothing/gloves/force = TRADER_BLACKLIST_ALL, /obj/item/clothing/gloves/swat/bst = TRADER_BLACKLIST, - /obj/item/clothing/gloves/watch/fluff = TRADER_BLACKLIST_ALL, + /obj/item/clothing/wrists/watch/fluff = TRADER_BLACKLIST_ALL, /obj/item/clothing/gloves/fluff = TRADER_BLACKLIST_ALL, /obj/item/clothing/head = TRADER_SUBTYPES_ONLY, /obj/item/clothing/head/beret/centcom = TRADER_BLACKLIST_ALL, diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 4bc3c6472b2..225e6bf7268 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -487,8 +487,8 @@ icon_state = "RPED" item_state = "RPED" item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_device.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_device.dmi' + slot_l_hand_str = 'icons/mob/items/device/lefthand_device.dmi', + slot_r_hand_str = 'icons/mob/items/device/righthand_device.dmi' ) w_class = ITEMSIZE_HUGE can_hold = list(/obj/item/stock_parts,/obj/item/reagent_containers/glass/beaker) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 4113640eec0..f29b40aaa8e 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -49,10 +49,10 @@ else return null -//Will return the contents of an atom recursivly to a depth of 'searchDepth' -/atom/proc/GetAllContents(searchDepth = 5) +//Will return the contents of an atom recursively to a depth of 'searchDepth' +/atom/proc/GetAllContents(searchDepth = 5, checkClient = 1, checkSight = 1, includeMobs = 1, includeObjects = 1) var/list/L = list() - recursive_content_check(src, L, recursion_limit = searchDepth) + recursive_content_check(src, L, searchDepth, checkClient, checkSight, includeMobs, includeObjects) return L diff --git a/code/game/gamemodes/cult/items/armor.dm b/code/game/gamemodes/cult/items/armor.dm index 38603e08b0e..1db756fd275 100644 --- a/code/game/gamemodes/cult/items/armor.dm +++ b/code/game/gamemodes/cult/items/armor.dm @@ -11,7 +11,7 @@ icon_state = "magusred" item_state = "magusred" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - flags_inv = HIDEGLOVES|HIDEJUMPSUIT + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDEJUMPSUIT /obj/item/clothing/head/helmet/space/cult name = "eldritch voidsuit helmet" @@ -36,7 +36,7 @@ armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) siemens_coefficient = 0 body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS - flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDESHOES + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDESHOES /obj/item/clothing/suit/space/cult/cultify() - return \ No newline at end of file + return diff --git a/code/game/machinery/autolathe_datums.dm b/code/game/machinery/autolathe_datums.dm index 69dc941d9ee..74a5499dbd5 100644 --- a/code/game/machinery/autolathe_datums.dm +++ b/code/game/machinery/autolathe_datums.dm @@ -370,7 +370,7 @@ /datum/autolathe/recipe/labeler name = "hand labeler" - path = /obj/item/hand_labeler + path = /obj/item/device/hand_labeler category = "General" /datum/autolathe/recipe/destTagger @@ -539,4 +539,4 @@ name = "brass knuckles" path = /obj/item/clothing/gloves/brassknuckles hidden = 1 - category = "General" \ No newline at end of file + category = "General" diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 49ff1a159d6..7d946cacd36 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -105,7 +105,7 @@ for reference: if("brute") src.health -= W.force * 0.75 else - animate_shake() + shake_animation() playsound(src.loc, material.hitsound, W.get_clamped_volume(), 1) if (src.health <= 0) visible_message("The barricade is smashed apart!") diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index beda7abd3b2..3813abe5143 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -317,9 +317,9 @@ power_change() return - else if(istype(W,/obj/item/vending_refill)) + else if(istype(W,/obj/item/device/vending_refill)) if(panel_open) - var/obj/item/vending_refill/VR = W + var/obj/item/device/vending_refill/VR = W if(VR.charges) if(VR.vend_id == vend_id) VR.restock_inventory(src) diff --git a/code/game/machinery/vending_items.dm b/code/game/machinery/vending_items.dm index 954c9ef2557..f2bced2a820 100644 --- a/code/game/machinery/vending_items.dm +++ b/code/game/machinery/vending_items.dm @@ -1,14 +1,10 @@ -/obj/item/vending_refill +/obj/item/device/vending_refill name = "resupply canister" var/vend_id = "generic" icon = 'icons/obj/assemblies/electronic_setups.dmi' icon_state = "setup_medium-open" item_state = "restock_unit" - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_device.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_device.dmi', - ) desc = "A vending machine restock cart." force = 7 throwforce = 10 @@ -17,14 +13,14 @@ w_class = ITEMSIZE_NORMAL var/charges = 0 -/obj/item/vending_refill/examine(mob/user) +/obj/item/device/vending_refill/examine(mob/user) ..() if(charges > 0) to_chat(user, "It can restock [charges] item(s).") else to_chat(user, "It's empty!") -/obj/item/vending_refill/proc/restock_inventory(var/obj/machinery/vending/vendor) +/obj/item/device/vending_refill/proc/restock_inventory(var/obj/machinery/vending/vendor) if(vendor) for(var/datum/data/vending_product/product in vendor.product_records) if(product.amount < product.max_amount) @@ -38,72 +34,72 @@ //can refill most vendors from half depleted once. -/obj/item/vending_refill/booze +/obj/item/device/vending_refill/booze name = "booze resupply canister" vend_id = "booze" charges = 100 //holy shit that's a lot of booze -/obj/item/vending_refill/tools +/obj/item/device/vending_refill/tools name = "tools resupply canister" vend_id = "tools" charges = 25 -/obj/item/vending_refill/coffee +/obj/item/device/vending_refill/coffee name = "coffee resupply canister" vend_id = "coffee" charges = 38 -/obj/item/vending_refill/snack +/obj/item/device/vending_refill/snack name = "snacks resupply canister" vend_id = "snacks" charges = 38 -/obj/item/vending_refill/cola +/obj/item/device/vending_refill/cola name = "cola resupply canister" vend_id = "cola" charges = 50 -/obj/item/vending_refill/smokes +/obj/item/device/vending_refill/smokes name = "smokes resupply canister" vend_id = "smokes" charges = 25 -/obj/item/vending_refill/meds +/obj/item/device/vending_refill/meds name = "meds resupply canister" vend_id = "meds" charges = 38 -/obj/item/vending_refill/robust +/obj/item/device/vending_refill/robust name = "security resupply canister" vend_id = "security" charges = 25 -/obj/item/vending_refill/hydro +/obj/item/device/vending_refill/hydro name = "hydro resupply canister" vend_id = "hydro" charges = 23 -/obj/item/vending_refill/seeds +/obj/item/device/vending_refill/seeds name = "resupply canister" vend_id = SEED_NOUN_SEEDS charges = 175 -/obj/item/vending_refill/cutlery +/obj/item/device/vending_refill/cutlery name = "cutlery resupply canister" vend_id = "cutlery" charges = 50 -/obj/item/vending_refill/robo +/obj/item/device/vending_refill/robo name = "robo-tools resupply canister" vend_id = "robo-tools" charges = 38 -/obj/item/vending_refill/zora +/obj/item/device/vending_refill/zora name = "Zo'ra Soda resupply canister" vend_id = "zora" charges = 40 -/obj/item/vending_refill/battlemonsters +/obj/item/device/vending_refill/battlemonsters name = "Battlemonsters resupply canister" vend_id = "battlemonsters" charges = 40 diff --git a/code/game/machinery/vending_types.dm b/code/game/machinery/vending_types.dm index b68899065de..2d9f5eb7c56 100644 --- a/code/game/machinery/vending_types.dm +++ b/code/game/machinery/vending_types.dm @@ -26,18 +26,18 @@ vend_id = "admin" req_access = list(access_janitor) products = list( - /obj/item/vending_refill/booze = 1, - /obj/item/vending_refill/tools = 1, - /obj/item/vending_refill/coffee = 1, - /obj/item/vending_refill/snack = 1, - /obj/item/vending_refill/cola = 1, - /obj/item/vending_refill/smokes = 1, - /obj/item/vending_refill/meds = 1, - /obj/item/vending_refill/robust = 1, - /obj/item/vending_refill/hydro = 1, - /obj/item/vending_refill/cutlery = 1, - /obj/item/vending_refill/robo = 1, - /obj/item/vending_refill/battlemonsters = 1, + /obj/item/device/vending_refill/booze = 1, + /obj/item/device/vending_refill/tools = 1, + /obj/item/device/vending_refill/coffee = 1, + /obj/item/device/vending_refill/snack = 1, + /obj/item/device/vending_refill/cola = 1, + /obj/item/device/vending_refill/smokes = 1, + /obj/item/device/vending_refill/meds = 1, + /obj/item/device/vending_refill/robust = 1, + /obj/item/device/vending_refill/hydro = 1, + /obj/item/device/vending_refill/cutlery = 1, + /obj/item/device/vending_refill/robo = 1, + /obj/item/device/vending_refill/battlemonsters = 1, ) random_itemcount = 0 light_color = COLOR_GOLD diff --git a/code/game/modifiers/modifiers.dm b/code/game/modifiers/modifiers.dm index ee03e9c040f..a4010e59d7d 100644 --- a/code/game/modifiers/modifiers.dm +++ b/code/game/modifiers/modifiers.dm @@ -172,7 +172,7 @@ it should be avoided in favour of manual removal where possible //This list can be overridden if you want a custom slot whitelist var/list/valid_equipment_slots = list(slot_back, slot_wear_mask, slot_handcuffed, slot_belt, \ slot_wear_id, slot_l_ear, slot_glasses, slot_gloves, slot_head, slot_shoes, slot_wear_suit, \ - slot_w_uniform,slot_legcuffed, slot_r_ear, slot_legs, slot_tie) + slot_w_uniform,slot_legcuffed, slot_r_ear, slot_legs, slot_tie, slot_wrists) diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm index 42e0751c555..9c84ce8ef56 100644 --- a/code/game/objects/effects/chem/foam.dm +++ b/code/game/objects/effects/chem/foam.dm @@ -172,7 +172,7 @@ qdel(src) else to_chat(user, SPAN_NOTICE("You hit the metal foam but bounce off it.")) - animate_shake() + shake_animation() /obj/structure/foamedmetal/attackby(var/obj/item/I, var/mob/user) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) @@ -193,7 +193,7 @@ if(S.get_amount() < 4) to_chat(user, SPAN_NOTICE("There isn't enough material here to construct a wall.")) return - + var/material/M = SSmaterials.get_material_by_name(S.default_type) if(!istype(M)) return @@ -230,7 +230,7 @@ qdel(src) else to_chat(user, SPAN_NOTICE("You hit the metal foam to no effect.")) - animate_shake() + shake_animation() /obj/structure/foamedmetal/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0) if(air_group) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index e4f7f4c584e..4f7822e03bd 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -108,8 +108,8 @@ /obj/item/device icon = 'icons/obj/device.dmi' item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_device.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_device.dmi', + slot_l_hand_str = 'icons/mob/items/device/lefthand_device.dmi', + slot_r_hand_str = 'icons/mob/items/device/righthand_device.dmi', ) pickup_sound = 'sound/items/pickup/device.ogg' drop_sound = 'sound/items/drop/device.ogg' @@ -372,7 +372,8 @@ var/list/global/slot_flags_enumeration = list( "[slot_r_ear]" = SLOT_EARS|SLOT_TWOEARS, "[slot_w_uniform]" = SLOT_ICLOTHING, "[slot_wear_id]" = SLOT_ID, - "[slot_tie]" = SLOT_TIE + "[slot_tie]" = SLOT_TIE, + "[slot_wrists]" = SLOT_WRISTS ) //the mob M is attempting to equip this item into the slot passed through as 'slot'. Return 1 if it can do this and 0 if it can't. @@ -762,6 +763,8 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. M.update_inv_pockets() if (slot_s_store) M.update_inv_s_store() + if (slot_wrists) + M.update_inv_wrists() // Attacks mobs that are adjacent to the target and user. /obj/item/proc/cleave(var/mob/living/user, var/mob/living/target) @@ -846,3 +849,13 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. /obj/item/proc/extinguish_fire() return + +/obj/item/proc/get_print_info(var/no_clear = TRUE) + if(no_clear) + . = "" + . += "Damage: [force]
" + . += "Damage Type: [damtype]
" + . += "Sharp: [sharp ? "yes" : "no"]
" + . += "Dismemberment: [edge ? "likely to dismember" : "unlikely to dismember"]
" + . += "Penetration: [armor_penetration]
" + . += "Throw Force: [throwforce]
" diff --git a/code/game/objects/items/airbubble.dm b/code/game/objects/items/airbubble.dm index b4d6ba42861..ed8133c953a 100644 --- a/code/game/objects/items/airbubble.dm +++ b/code/game/objects/items/airbubble.dm @@ -248,7 +248,7 @@ if ((world.time - last_shake) > 5 SECONDS) playsound(loc, "sound/items/[pick("rip1","rip2")].ogg", 100, 1) - animate_shake() + shake_animation() last_shake = world.time if (!req_breakout()) @@ -274,11 +274,11 @@ return breakout = FALSE - to_chat(escapee, "You successfully break out! Tearing the bubble's walls!") + to_chat(escapee, "You successfully break out! Tearing the bubble's walls!") // holy shit this is hilarious visible_message("\the [escapee] successfully broke out of \the [src]! Tearing the bubble's walls!") playsound(loc, "sound/items/[pick("rip1","rip2")].ogg", 100, 1) break_open() - animate_shake() + shake_animation() desc += " It has hole in it! Maybe you shouldn't use it!" // We are out finally, the bubble is ripped. So dump everything out from it. Especially air and user. diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 74e9b327f2c..efff391c539 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -1,6 +1,12 @@ /obj/item/device/megaphone name = "megaphone" - desc = "A device used to project your voice. Loudly." + desc = "Pretend to be a director for a brief moment before someone tackles you to make you shut up." + desc_fluff = "Annoy your colleagues! Scare interns! Impress no one!" + desc_info = "A device used to project your voice. Loudly." + item_icons = list( + slot_l_hand_str = 'icons/mob/items/device/lefthand_megaphone.dmi', + slot_r_hand_str = 'icons/mob/items/device/righthand_megaphone.dmi', + ) icon_state = "megaphone" item_state = "megaphone" w_class = ITEMSIZE_SMALL @@ -14,17 +20,17 @@ var/needs_user_location = TRUE /obj/item/device/megaphone/attack_self(mob/living/user as mob) - if (user.client) + if(user.client) if(user.client.prefs.muted & MUTE_IC) - to_chat(src, "You cannot speak in IC (muted).") + to_chat(src, SPAN_WARNING("You cannot speak in IC (muted).")) return if(!ishuman(user)) - to_chat(user, "You don't know how to use this!") + to_chat(user, SPAN_WARNING("You don't know how to use this!")) return if(user.silent) return - if(spamcheck) - to_chat(user, "\The [src] needs to recharge!") + if(spamcheck > world.time) + to_chat(user, SPAN_WARNING("\The [src] needs to recharge!")) return var/message = sanitize(input(user, "Shout a message?", "Megaphone", null) as text) @@ -40,19 +46,72 @@ user.visible_message("[user] broadcasts, \"[pick(insultmsg)]\"") insults-- else - to_chat(user, "*BZZZZzzzzzt*") + to_chat(user, SPAN_WARNING("*BZZZZzzzzzt*")) else user.visible_message("[user] broadcasts, \"[message]\"") if(activation_sound) playsound(loc, activation_sound, 100, 0, 1) - spamcheck = 1 - spawn(20) - spamcheck = 0 + spamcheck = world.time + 50 return /obj/item/device/megaphone/emag_act(var/remaining_charges, var/mob/user) if(!emagged) - to_chat(user, "You overload \the [src]'s voice synthesizer.") + to_chat(user, SPAN_WARNING("You overload \the [src]'s voice synthesizer.")) emagged = 1 insults = rand(1, 3)//to prevent dickflooding return 1 + +/obj/item/device/megaphone/red + name = "red megaphone" + desc = "To make people do your bidding." + desc_fluff = "It's in a menacing crimson red." + icon_state = "megaphone_red" + item_state = "megaphone_red" + +/obj/item/device/megaphone/sec + name = "security megaphone" + desc = "To stop people from stepping over the police tape." + desc_fluff = "Nothing to see here. Move along." + icon_state = "megaphone_sec" + item_state = "megaphone_sec" + +/obj/item/device/megaphone/med + name = "medical megaphone" + desc = "To make people leave the ICU." + desc_fluff = "Realistcally only used to startle the CMO's cat." + icon_state = "megaphone_med" + item_state = "megaphone_med" + +/obj/item/device/megaphone/sci + name = "science megaphone" + desc = "To make people stand clear of the blast zone." + desc_fluff = "Something to rival the explosions heard in the science department." + icon_state = "megaphone_sci" + item_state = "megaphone_sci" + +/obj/item/device/megaphone/engi + name = "engineering megaphone" + desc = "To make people get out of construction sites." + desc_fluff = "At home in construction sites and road works, it'll stick by you in diverting traffic and dim-witted coworkers." + icon_state = "megaphone_engi" + item_state = "megaphone_engi" + +/obj/item/device/megaphone/cargo + name = "supply megaphone" + desc = "To make people to push crates." + desc_fluff = "Only certified forklift operators will be able to handle the sheer power of this megaphone. Either that, or just be the Quartermaster." + icon_state = "megaphone_cargo" + item_state = "megaphone_cargo" + +/obj/item/device/megaphone/command + name = "command megaphone" + desc = "To make people to get back to work." + desc_fluff = "Exude authority by decree of having the louder voice." + icon_state = "megaphone_command" + item_state = "megaphone_command" + +/obj/item/device/megaphone/clown + name = "clown's megaphone" + desc = "Something that should not exist." + icon_state = "megaphone_clown" + item_state = "megaphone_clown" diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index ecc5883edbd..71f4039cb88 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -647,6 +647,7 @@ BREATH ANALYZER /obj/item/device/advanced_healthanalyzer/attack(mob/living/M, mob/living/user) if(!internal_bodyscanner) return + user.visible_message("[user] starts scanning \the [M] with \the [src].", SPAN_NOTICE("You start scanning \the [M] with \the [src].")) if(do_after(user, 7 SECONDS, TRUE)) print_scan(M, user) add_fingerprint(user) diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 24cda0dc90f..b4b98b1b1c1 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -173,7 +173,7 @@ /obj/item/storage/box/fancy/crayons, /obj/item/soap/deluxe, /obj/item/pen/invisible, - /obj/item/clothing/gloves/watch, + /obj/item/clothing/wrists/watch, /obj/item/lipstick/random, /obj/item/clothing/shoes/carp, /obj/item/bikehorn, @@ -347,4 +347,4 @@ /obj/item/xmasgift/viscerator gift_type = /mob/living/simple_animal/hostile/viscerator - w_class = ITEMSIZE_NORMAL \ No newline at end of file + w_class = ITEMSIZE_NORMAL diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 182161ff191..eb2733a5ab6 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -122,6 +122,15 @@ user.visible_message("\The [user] blocks [attack_text] with \the [src]!") return 1 +/obj/item/melee/energy/get_print_info() + . = ..() + . += "Active Damage: [active_force]
" + . += "Active Throw Force: [active_throwforce]
" + . += "Blocks Bullets: [can_block_bullets ? "true" : "false"]
" + . += "Block Chance: [base_block_chance]
" + . += "Projectile Reflection Chance: [base_reflectchance]
" + . += "Shield Rating: [shield_power]
" + /obj/item/melee/energy/glaive name = "energy glaive" desc = "An energized glaive." diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index 4606c4c6390..85c82f9e2fb 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -202,7 +202,7 @@ var/list/tape_roll_applications = list() if(user.a_intent == I_HELP) lifted = !lifted user.visible_message("[user] [lifted ? "lifts" : "drops"] the [initial(name)], [lifted ? "allowing" : "blocking"] passage.", SPAN_NOTICE("You [lifted ? "lift" : "drop"] the [initial(name)], [lifted ? "allowing" : "blocking"] passage.")) - var/shake_time = animate_shake() + var/shake_time = shake_animation() sleep(shake_time) if(!allowed(user)) crumple(user) @@ -239,4 +239,4 @@ var/list/tape_roll_applications = list() qdel(P) cur = get_step(cur,dir[i]) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 98f825ae87a..1da149596e7 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -75,7 +75,7 @@ L.visible_message("[L] tears open the [src], spilling its contents everywhere!", "You tear open the [src], spilling its contents everywhere!") spill() else - animate_shake() + shake_animation() var/toplay = pick(list('sound/effects/creatures/nibble1.ogg','sound/effects/creatures/nibble2.ogg')) playsound(loc, toplay, 30, 1) damage(damage) diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm index fd1dd16c733..e4d07ace7f6 100644 --- a/code/game/objects/items/weapons/storage/internal.dm +++ b/code/game/objects/items/weapons/storage/internal.dm @@ -46,10 +46,10 @@ if (!( user.restrained() ) && !( user.stat )) switch(over_object.name) - if(BP_R_HAND) + if("right hand") user.u_equip(master_item) user.put_in_r_hand(master_item) - if(BP_L_HAND) + if("left hand") user.u_equip(master_item) user.put_in_l_hand(master_item) master_item.add_fingerprint(user) @@ -96,4 +96,4 @@ /obj/item/storage/internal/skrell/Initialize() . = ..() - name = initial(name) \ No newline at end of file + name = initial(name) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 8b12d47c750..aeb717bccbe 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -84,10 +84,10 @@ return switch(over_object.name) - if(BP_R_HAND) + if("right hand") usr.u_equip(src) usr.put_in_r_hand(src,FALSE) - if(BP_L_HAND) + if("left hand") usr.u_equip(src) usr.put_in_l_hand(src,FALSE) src.add_fingerprint(usr) @@ -323,12 +323,12 @@ if(LAZYLEN(can_hold)) if(!is_type_in_list(W, can_hold)) - if(!stop_messages && ! istype(W, /obj/item/hand_labeler)) + if(!stop_messages && ! istype(W, /obj/item/device/hand_labeler)) to_chat(usr, "[src] cannot hold \the [W].") return 0 var/max_instances = can_hold[W.type] if(max_instances && instances_of_type_in_list(W, contents, TRUE) >= max_instances) - if(!stop_messages && !istype(W, /obj/item/hand_labeler)) + if(!stop_messages && !istype(W, /obj/item/device/hand_labeler)) to_chat(usr, "[src] has no more space specifically for \the [W].") return 0 @@ -523,8 +523,8 @@ to_chat(user, "Trying to place a loaded tray into [src] was a bad idea.") return - if(istype(W, /obj/item/hand_labeler)) - var/obj/item/hand_labeler/HL = W + if(istype(W, /obj/item/device/hand_labeler)) + var/obj/item/device/hand_labeler/HL = W if(HL.mode == 1) return diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index c9233f7ded3..c80c7672bf0 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -141,7 +141,7 @@ /obj/item/pen/chameleon = 1, /obj/item/device/destTagger = 1, /obj/item/stack/packageWrap = 1, - /obj/item/hand_labeler = 1 + /obj/item/device/hand_labeler = 1 ) /obj/item/storage/box/syndie_kit/special_pens diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index 45c3c42c0ea..7b1b5c8ef0a 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -248,7 +248,7 @@ Frequency: else target_closet.visible_message(SPAN_WARNING("\The [target_closet] rattles.")) to_chat(user, SPAN_NOTICE("You teleport into the target closet, bumping into the closed door.")) - target_closet.animate_shake() + target_closet.shake_animation() playsound(get_turf(src), 'sound/effects/grillehit.ogg', 100, TRUE) /obj/item/closet_teleporter/Destroy() diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index 61eed45d2f2..2fda26da7d5 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -146,7 +146,7 @@ anchored = FALSE deployed = FALSE update_icon() - animate_shake() + shake_animation() ..() @@ -236,7 +236,7 @@ buckle_mob(L) playsound(src, 'sound/weapons/beartrap_shut.ogg', 100, 1) deployed = FALSE - src.animate_shake() + src.shake_animation() update_icon() /obj/item/trap/animal/proc/req_breakout() @@ -252,7 +252,7 @@ if ((world.time - last_shake) > 5 SECONDS) playsound(loc, "sound/effects/grillehit.ogg", 100, 1) - animate_shake() + shake_animation() last_shake = world.time return TRUE @@ -372,7 +372,7 @@ unbuckle_mob() captured = null visible_message(msg) - animate_shake() + shake_animation() update_icon() release_time = world.time @@ -661,4 +661,3 @@ return else ..() - diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index bd1fd47444f..9b7a8d06825 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -218,13 +218,6 @@ /obj/proc/Created() return -/obj/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) - return 7 // how long it takes to do this - /obj/proc/rotate(var/mob/user, var/anchored_ignore = FALSE) if(use_check_and_message(user)) return diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index ded0cdca330..0053c63654c 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -1009,10 +1009,10 @@ icon = 'icons/obj/clothing/gloves.dmi' icon_state = "watch" problist = list( - /obj/item/clothing/gloves/watch = 1, - /obj/item/clothing/gloves/watch/silver = 0.7, - /obj/item/clothing/gloves/watch/gold = 0.5, - /obj/item/clothing/gloves/watch/spy = 0.3, + /obj/item/clothing/wrists/watch = 1, + /obj/item/clothing/wrists/watch/silver = 0.7, + /obj/item/clothing/wrists/watch/gold = 0.5, + /obj/item/clothing/wrists/watch/spy = 0.3, ) /obj/random/hoodie diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 21dbccd6306..25c8d142cf8 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -341,8 +341,8 @@ ) else attack_hand(user) - else if(istype(W, /obj/item/hand_labeler)) - var/obj/item/hand_labeler/HL = W + else if(istype(W, /obj/item/device/hand_labeler)) + var/obj/item/device/hand_labeler/HL = W if (HL.mode == 1) return else @@ -376,7 +376,7 @@ return step_towards(O, loc) if(user != O) - user.show_viewers("[user] stuffs [O] into [src]!") + user.visible_message(SPAN_DANGER("[user] stuffs \the [O] into \the [src]!"), SPAN_NOTICE("You stuff \the [O] into \the [src]."), range = 3) add_fingerprint(user) return @@ -469,7 +469,7 @@ breakout = 1 for(var/i in 1 to time) //minutes * 6 * 5seconds * 2 playsound(loc, 'sound/effects/grillehit.ogg', 100, 1) - animate_shake() + shake_animation() if (bar) bar.update(i) @@ -496,7 +496,7 @@ visible_message("\the [escapee] successfully broke out of \the [src]!") playsound(loc, 'sound/effects/grillehit.ogg', 100, 1) break_open() - animate_shake() + shake_animation() qdel(bar) /obj/structure/closet/proc/break_open() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index d9b755dd9e1..401d01487a8 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -47,6 +47,7 @@ new /obj/item/modular_computer/handheld/custom_loadout/advanced/cargo_delivery(src) new /obj/item/export_scanner(src) new /obj/item/device/orbital_dropper/drill(src) + new /obj/item/device/megaphone/cargo(src) /obj/structure/closet/secure_closet/merchant name = "merchant locker" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index a0353a37627..7ef690325e2 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -27,6 +27,7 @@ new /obj/item/clothing/shoes/brown(src) new /obj/item/device/radio/headset/heads/ce(src) new /obj/item/device/radio/headset/heads/ce/alt(src) + new /obj/item/device/megaphone/engi(src) new /obj/item/storage/toolbox/mechanical(src) new /obj/item/clothing/suit/storage/hazardvest(src) new /obj/item/clothing/mask/gas(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 700d6c2dd67..58ad56fb3a3 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -111,6 +111,7 @@ new /obj/item/clothing/gloves/latex/nitrile(src) new /obj/item/device/radio/headset/heads/cmo(src) new /obj/item/device/radio/headset/heads/cmo/alt(src) + new /obj/item/device/megaphone/med(src) new /obj/item/device/flash(src) new /obj/item/reagent_containers/hypospray/cmo(src) new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 5837581350a..b4c7b16f925 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -68,3 +68,4 @@ new /obj/item/clothing/gloves/latex/nitrile(src) new /obj/item/device/radio/headset/heads/rd(src) new /obj/item/device/radio/headset/heads/rd/alt(src) + new /obj/item/device/megaphone/sci(src) 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 5cc7921d8c5..653e2ffdeca 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 @@ -148,8 +148,8 @@ playsound(loc, W.usesound, 50, 1) wrenched = 1 anchored = 1 - else if(istype(W, /obj/item/hand_labeler)) - var/obj/item/hand_labeler/HL = W + else if(istype(W, /obj/item/device/hand_labeler)) + var/obj/item/device/hand_labeler/HL = W if (HL.mode == 1) return else diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 9411185e338..49aa536c50f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -20,6 +20,7 @@ //Tools new /obj/item/device/radio/headset/heads/captain(src) new /obj/item/device/radio/headset/heads/captain/alt(src) + new /obj/item/device/megaphone/command(src) new /obj/item/gun/energy/disruptorpistol(src) new /obj/item/device/flash(src) new /obj/item/melee/telebaton(src) @@ -76,6 +77,7 @@ //Tools new /obj/item/device/radio/headset/heads/hop(src) new /obj/item/device/radio/headset/heads/hop/alt(src) + new /obj/item/device/megaphone/command(src) new /obj/item/gun/energy/disruptorpistol(src) new /obj/item/gun/projectile/sec/flash(src) new /obj/item/device/flash(src) @@ -139,6 +141,7 @@ //Tools new /obj/item/device/radio/headset/heads/hos(src) new /obj/item/device/radio/headset/heads/hos/alt(src) + new /obj/item/device/megaphone/sec(src) new /obj/item/storage/box/tranquilizer(src) new /obj/item/clothing/glasses/sunglasses/sechud(src) new /obj/item/clothing/glasses/sunglasses/sechud/head(src) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index e6d91d75045..069451b754b 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -113,8 +113,8 @@ playsound(loc, 'sound/items/wirecutter.ogg', 100, 1) rigged = 0 return - else if(istype(W, /obj/item/hand_labeler)) - var/obj/item/hand_labeler/HL = W + else if(istype(W, /obj/item/device/hand_labeler)) + var/obj/item/device/hand_labeler/HL = W if (HL.mode == 1) return else @@ -327,8 +327,8 @@ return ..() if(istype(W, /obj/item/melee/energy/blade)) emag_act(INFINITY, user) - if(istype(W, /obj/item/hand_labeler)) - var/obj/item/hand_labeler/HL = W + if(istype(W, /obj/item/device/hand_labeler)) + var/obj/item/device/hand_labeler/HL = W if (HL.mode == 1) return else if(!opened) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 0e8c95065ce..d1073256785 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -18,7 +18,9 @@ dir = EAST density = TRUE anchored = TRUE + var/locked = FALSE var/obj/structure/m_tray/connected = null + var/tray = /obj/structure/m_tray /obj/structure/morgue/Destroy() if(connected) @@ -29,10 +31,21 @@ if(connected) icon_state = "morgue0" else - if(contents.len) - icon_state = "morgue2" - else - icon_state = "morgue1" + icon_state = "morgue1" + var/list/searching = GetAllContents(searchDepth = 3, checkClient = 0) // Search inside bodybags as well. + for(var/mob/living/M in searching) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(C.status_flags & FAKEDEATH) + icon_state = "morgue2" + switch(C.stat) + if(DEAD) + icon_state = "morgue2" + if(UNCONSCIOUS) + icon_state = "morgue3" + if(CONSCIOUS) + icon_state = "morgue4" + break return /obj/structure/morgue/ex_act(severity) @@ -60,7 +73,7 @@ return /obj/structure/morgue/attack_hand(mob/user) - if(connected) + if(connected && !locked) for(var/atom/movable/A in connected.loc) if(!A.anchored) A.forceMove(src) @@ -68,29 +81,7 @@ playsound(src, 'sound/effects/roll.ogg', 5, 1) QDEL_NULL(connected) else - var/turf/S = get_step(src, src.dir) - if(!S) - return - else - if(S.contains_dense_objects()) - to_chat(user, SPAN_WARNING("There's something in the way of \the [src]!")) - return - playsound(src, 'sound/effects/roll.ogg', 5, 1) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - connected = new /obj/structure/m_tray(src.loc) - step(src.connected, src.dir) - connected.layer = OBJ_LAYER - 0.1 - var/turf/T = get_step(src, src.dir) - if(T.contents.Find(connected)) - connected.connected = src - icon_state = "morgue0" - for(var/atom/movable/A in src) - A.forceMove(connected.loc) - connected.icon_state = "morguet" - connected.set_dir(src.dir) - else - QDEL_NULL(connected) - add_fingerprint(user) + relaymove(user) update_icon() return @@ -101,21 +92,21 @@ /obj/structure/morgue/attackby(obj/P, mob/user) if(P.ispen()) - var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text + var/t = input(user, "What would you like the label to be?", name) as text if(user.get_active_hand() != P) return - if((!in_range(src, usr) && src.loc != user)) + if((!in_range(src, usr) > 1 && src.loc != user)) return t = sanitizeSafe(t, MAX_NAME_LEN) if(t) - name = "Morgue- '[t]'" + name = "[initial(name)] - '[t]'" else - name = "Morgue" + name = initial(name) add_fingerprint(user) return /obj/structure/morgue/relaymove(mob/user) - if(user.stat) + if(user.stat || locked) return var/turf/S = get_step(src, src.dir) if(!S) @@ -124,21 +115,21 @@ if(S.contains_dense_objects()) to_chat(user, SPAN_WARNING("There's something in the way of \the [src]!")) return - connected = new /obj/structure/m_tray(src.loc) - step(connected, EAST) + playsound(src, 'sound/effects/roll.ogg', 5, 1) + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + connected = new tray(src.loc) + step(connected, src.dir) connected.layer = OBJ_LAYER - 0.1 - var/turf/T = get_step(src, EAST) + var/turf/T = get_step(src, src.dir) if(T.contents.Find(src.connected)) connected.connected = src - icon_state = "morgue0" for(var/atom/movable/A in src) A.forceMove(connected.loc) - connected.icon_state = "morguet" else QDEL_NULL(connected) + update_icon() return - /* * Morgue tray */ @@ -148,10 +139,10 @@ icon = 'icons/obj/stationobjs.dmi' icon_state = "morguet" density = TRUE - layer = 2.0 - var/obj/structure/morgue/connected = null anchored = TRUE throwpass = TRUE + layer = TURF_LAYER + var/obj/structure/morgue/connected = null /obj/structure/m_tray/Destroy() if(connected?.connected == src) @@ -180,42 +171,44 @@ return O.forceMove(src.loc) if(user != O) - user.visible_message("[user] stuffs \the [O] into \the [src]!", SPAN_NOTICE("You stuff \the [O] into \the [src]."), range = 3) - + user.visible_message(SPAN_DANGER("[user] stuffs \the [O] into \the [src]!"), SPAN_NOTICE("You stuff \the [O] into \the [src]."), range = 3) + add_fingerprint(user) + return /* * Crematorium */ -/obj/structure/crematorium +/obj/structure/morgue/crematorium name = "crematorium" desc = "A human incinerator. Works well on barbeque nights." - icon = 'icons/obj/stationobjs.dmi' icon_state = "crema1" - density = TRUE - anchored = TRUE - var/obj/structure/c_tray/connected = null + dir = SOUTH + tray = /obj/structure/m_tray/c_tray var/cremating = FALSE - var/locked = FALSE var/id = 1 var/_wifi_id var/datum/wifi/receiver/button/crematorium/wifi_receiver -/obj/structure/crematorium/Initialize() +/obj/structure/morgue/crematorium/Initialize() . = ..() if(_wifi_id) wifi_receiver = new(_wifi_id, src) -/obj/structure/crematorium/Destroy() - if(connected) - QDEL_NULL(connected) +/obj/structure/morgue/crematorium/Destroy() + ..() if(wifi_receiver) QDEL_NULL(wifi_receiver) return ..() -/obj/structure/crematorium/update_icon() +/obj/structure/morgue/crematorium/update_icon() + set_light(0) if(cremating) icon_state = "crema_active" + set_light(3, 1, LIGHT_COLOR_FIRE) return + for(var/obj/machinery/button/switch/crematorium/C in range(3, src)) + C.active = FALSE + C.update_icon() if(connected) icon_state = "crema0" else @@ -224,214 +217,152 @@ else icon_state = "crema1" -/obj/structure/crematorium/ex_act(severity) - switch(severity) - if(1.0) - for(var/atom/movable/A in src) - A.forceMove(src.loc) - ex_act(severity) - qdel(src) - return - if(2.0) - if(prob(50)) - for(var/atom/movable/A in src) - A.forceMove(src.loc) - ex_act(severity) - qdel(src) - return - if(3.0) - if(prob(5)) - for(var/atom/movable/A in src) - A.forceMove(src.loc) - ex_act(severity) - qdel(src) - return - return - -/obj/structure/crematorium/attack_hand(mob/user as mob) +/obj/structure/morgue/crematorium/attack_hand(mob/user as mob) if(cremating) to_chat(user, SPAN_WARNING("It's locked.")) return - if(connected && !locked) - for(var/atom/movable/A in connected.loc) - if(!A.anchored ) - A.forceMove(src) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - qdel(connected) - else if(!locked) - var/turf/S = get_step(src, src.dir) - if(!S) - return - else - if(S.contains_dense_objects()) - to_chat(user, SPAN_WARNING("There's something in the way of \the [src]!")) - return - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - connected = new /obj/structure/c_tray(src.loc) - step(connected, src.dir) - connected.layer = OBJ_LAYER - 0.1 - var/turf/T = get_step(src, src.dir) - if(T.contents.Find(connected)) - connected.connected = src - src.icon_state = "crema0" - for(var/atom/movable/A in src) - A.forceMove(connected.loc) - connected.icon_state = "cremat" - else - qdel(src.connected) - add_fingerprint(user) - update_icon() + ..() -/obj/structure/crematorium/attackby(obj/P, mob/user as mob) - if(P.ispen()) - var/t = input(user, "What would you like the label to be?", "[src.name]") as text - if(user.get_active_hand() != P) - return - if((!in_range(src, usr) > 1 && src.loc != user)) - return - t = sanitizeSafe(t, MAX_NAME_LEN) - if(t) - name = "Crematorium- '[t]'" - else - name = "Crematorium" - add_fingerprint(user) - return - -/obj/structure/crematorium/relaymove(mob/user) - if(user.stat || locked) - return - var/turf/S = get_step(src, src.dir) - if(!S) - return - else - if(S.contains_dense_objects()) - to_chat(user, SPAN_WARNING("There's something in the way of \the [src]!")) - return - connected = new /obj/structure/c_tray(src.loc) - step(connected, src.dir) - connected.layer = OBJ_LAYER - 0.1 - var/turf/T = get_step(src, src.dir) - if(T.contents.Find(src.connected)) - connected.connected = src - icon_state = "crema0" - for(var/atom/movable/A in src) - A.forceMove(connected.loc) - connected.icon_state = "cremat" - else - QDEL_NULL(connected) - return - -/obj/structure/crematorium/proc/cremate(atom/A, mob/user) +/obj/structure/morgue/crematorium/proc/cremate(atom/A, mob/user) if(cremating) - return + return //don't let you cremate something twice or w/e + + cremating = TRUE + locked = TRUE if(contents.len <= 0) - visible_message(SPAN_WARNING("You hear a hollow crackle coming from \the [src]."), range = 3) - else - visible_message(SPAN_WARNING("You hear a roar as \the [src] activates.")) - cremating = TRUE - locked = TRUE + src.audible_message(SPAN_WARNING("You hear a hollow crackle."), 1) + flick("crema_empty", src) + set_light(3, 1, LIGHT_COLOR_FIRE) + sleep(4) + cremating = initial(cremating) + locked = initial(locked) update_icon() + return + else + if(length(search_contents_for(/obj/item/disk/nuclear))) + to_chat(A, SPAN_WARNING("The crematorium buzzes, indicating that something important is inside the crematorium, and must be removed.")) + cremating = initial(cremating) + locked = initial(locked) + update_icon() + return + src.audible_message(SPAN_WARNING("You hear a roar as \the [src] activates."), 1) + flick("crema_start", src) + update_icon() + var/desperation = 0 - for(var/mob/living/M in contents) - if(M.stat < UNCONSCIOUS) - if(!iscarbon(M)) - M.emote("scream") + var/list/searching = GetAllContents(searchDepth = 3, checkClient = 0) + for(var/mob/living/M in searching) + admin_attack_log(A, M, "Began cremating their victim.", "Has begun being cremated.", "began cremating") + if(iscarbon(M)) + var/mob/living/carbon/C = M + for(var/I, I < 60, I++) + C.bodytemperature += 50 + C.adjustFireLoss(20) + C.adjustBrainLoss(5) + + if(!(C in searching)) //In case we are removed at any point. + cremating = initial(cremating) + locked = initial(locked) + update_icon() + continue + + sleep(0.5 SECONDS) + if(prob(40) && (C.stat != DEAD)) + desperation = rand(1,5) + switch(desperation) //This is messy. A better solution would probably be to make more sounds, but... + if(1) + playsound(src.loc, 'sound/weapons/genhit.ogg', 45, 1) + shake_animation(2) + playsound(src.loc, 'sound/weapons/genhit.ogg', 45, 1) + if(2) + playsound(src.loc, 'sound/effects/grillehit.ogg', 45, 1) + shake_animation(3) + playsound(src.loc, 'sound/effects/grillehit.ogg', 45, 1) + if(3) + playsound(src, 'sound/effects/bang.ogg', 45, 1) + if(prob(50)) + playsound(src, 'sound/effects/bang.ogg', 45, 1) + shake_animation() + else + shake_animation(5) + if(4) + playsound(src, 'sound/effects/clang.ogg', 45, 1) + shake_animation(5) + if(5) + playsound(src, 'sound/weapons/smash.ogg', 50, 1) + if(prob(50)) + playsound(src, 'sound/weapons/smash.ogg', 50, 1) + shake_animation(9) + else + shake_animation() + else + sleep(5) + + if(M.stat == DEAD) + if(round_is_spooky()) + if(prob(50)) + playsound(src, 'sound/effects/ghost.ogg', 10, 5) + else + playsound(src, 'sound/effects/ghost2.ogg', 10, 5) + + admin_attack_log(A, M, "Cremated their victim.", "Was cremated.", "cremated") + if(desperation) + M.audible_message("[M]'s screams cease, as does any movement within \the [src]. All that remains is a dull, empty silence.") else - var/mob/living/carbon/C = M - C.emote("scream") - M.death(1) - M.ghostize() - qdel(M) + M.audible_message("\The [src] quietly shuts off. All that remains is a dull, empty silence.") + M.dust() for(var/obj/O in contents) //obj instead of obj/item so that bodybags and ashes get destroyed. We dont want tons and tons of ash piling up qdel(O) - var/obj/effect/decal/cleanable/ash/F = new /obj/effect/decal/cleanable/ash(src) - F.layer = OBJ_LAYER + var/obj/effect/decal/cleanable/ash/C = new /obj/effect/decal/cleanable/ash(src) + C.layer = OBJ_LAYER sleep(30) - cremating = FALSE - locked = FALSE + cremating = initial(cremating) + locked = initial(locked) update_icon() - playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + playsound(src.loc, 'sound/effects/spray.ogg', 50, 1) return - /* * Crematorium tray */ -/obj/structure/c_tray +/obj/structure/m_tray/c_tray name = "crematorium tray" desc = "Apply body before burning." - icon = 'icons/obj/stationobjs.dmi' icon_state = "cremat" - density = TRUE - anchored = TRUE - throwpass = TRUE - layer = 2.0 - var/obj/structure/crematorium/connected = null -/obj/structure/c_tray/Destroy() - if(connected?.connected == src) - connected.connected = null - connected = null - return ..() +/* + * Crematorium switch + */ -/obj/structure/c_tray/attack_hand(mob/user) - if(connected) - for(var/atom/movable/A in src.loc) - if(!A.anchored) - A.forceMove(src.connected) - connected.connected = null - connected.update_icon() - add_fingerprint(user) - qdel(src) - return - return - -/obj/structure/c_tray/MouseDrop_T(atom/movable/O, mob/user) - if(!istype(O, /atom/movable) || O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src) || user.contents.Find(O)) - return - if(!ismob(O) && !istype(O, /obj/structure/closet/body_bag)) - return - if(!ismob(user) || user.stat || user.lying || user.stunned) - return - O.forceMove(src.loc) - if(user != O) - user.visible_message("[user] stuffs \the [O] into \the [src]!", SPAN_NOTICE("You stuff \the [O] into \the [src]."), range = 3) - return - -/obj/machinery/button/crematorium +/obj/machinery/button/switch/crematorium name = "crematorium igniter" desc = "Burn baby burn!" - icon = 'icons/obj/power.dmi' - icon_state = "light0" req_access = list(access_crematorium) id = 1 var/cremate_dir // something for mappers, setting will make a crematorium in one step in this direction toggle -/obj/machinery/button/crematorium/update_icon() - return - -/obj/machinery/button/crematorium/attack_hand(mob/user) - playsound(src, /decl/sound_category/switch_sound, 30) +/obj/machinery/button/switch/crematorium/attack_hand(mob/user) + ..() if(!allowed(user)) to_chat(user, SPAN_WARNING("Access denied.")) return - if(..()) - return - var/list/obj/structure/crematorium/crematoriums = list() + var/list/obj/structure/morgue/crematorium/crematoriums = list() if(!cremate_dir) - for(var/obj/structure/crematorium/C in range(3, src)) + for(var/obj/structure/morgue/crematorium/C in range(3, src)) if(C.id == id) crematoriums += C else var/turf/T = get_step(src, cremate_dir) - var/obj/structure/crematorium/C = locate() in T + var/obj/structure/morgue/crematorium/C = locate() in T if(C?.id == id) crematoriums += C for(var/thing in crematoriums) - var/obj/structure/crematorium/C = thing - if(!C.cremating) + var/obj/structure/morgue/crematorium/C = thing + if(!C.cremating && !C.connected) + active = TRUE + update_icon() C.cremate(user) diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm index caa7dab348d..dd4f67715d0 100644 --- a/code/game/objects/structures/simple_doors.dm +++ b/code/game/objects/structures/simple_doors.dm @@ -173,7 +173,7 @@ user.visible_message("\The [user] hits \the [src] with \the [I] with no visible effect.") else user.do_attack_animation(src) - animate_shake() + shake_animation() user.visible_message("\The [user] forcefully strikes \the [src] with \the [I]!") playsound(src.loc, material.hitsound, W.get_clamped_volume(), 1) src.health -= W.force * 1 diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index a1f7b08cb2d..109c10ae0c0 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -257,15 +257,17 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M - var/washgloves = 1 - var/washshoes = 1 - var/washmask = 1 - var/washears = 1 - var/washglasses = 1 + var/washgloves = TRUE + var/washshoes = TRUE + var/washmask = TRUE + var/washears = TRUE + var/washglasses = TRUE + var/washwrists = TRUE if(H.wear_suit) washgloves = !(H.wear_suit.flags_inv & HIDEGLOVES) washshoes = !(H.wear_suit.flags_inv & HIDESHOES) + washwrists = !(H.wear_suit.flags_inv & HIDEWRISTS) if(H.head) washmask = !(H.head.flags_inv & HIDEMASK) @@ -318,6 +320,10 @@ if(H.belt.clean_blood()) H.update_inv_belt(0) update_icons_required = TRUE + if(H.wrists && washwrists) + if(H.wrists.clean_blood()) + H.update_inv_wrists(0) + update_icons_required = TRUE H.clean_blood(washshoes) else if(M.wear_mask) //if the mob is not human, it cleans the mask without asking for bitflags diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm index 2e06de2d1b1..33febb92d83 100644 --- a/code/game/turfs/simulated/water.dm +++ b/code/game/turfs/simulated/water.dm @@ -163,15 +163,17 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M - var/washgloves = 1 - var/washshoes = 1 - var/washmask = 1 - var/washears = 1 - var/washglasses = 1 + var/washgloves = TRUE + var/washshoes = TRUE + var/washmask = TRUE + var/washears = TRUE + var/washglasses = TRUE + var/washwrists = TRUE if(H.wear_suit) washgloves = !(H.wear_suit.flags_inv & HIDEGLOVES) washshoes = !(H.wear_suit.flags_inv & HIDESHOES) + washwrists = !(H.wear_suit.flags_inv & HIDEWRISTS) if(H.head) washmask = !(H.head.flags_inv & HIDEMASK) @@ -214,6 +216,9 @@ if(H.belt) if(H.belt.clean_blood()) H.update_inv_belt(0) + if(H.wrists && washwrists) + if(H.wrists.clean_blood()) + H.update_inv_wrists(0) H.clean_blood(washshoes) else if(M.wear_mask) //if the mob is not human, it cleans the mask without asking for bitflags diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index cbf721e2755..9667121ab22 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -123,4 +123,4 @@ return layer = TURF_LAYER + 0.2 - to_chat(usr, SPAN_NOTICE("You hide \the [src].")) \ No newline at end of file + to_chat(usr, SPAN_NOTICE("You hide \the [src].")) diff --git a/code/modules/cargo/random_stock/t1_common.dm b/code/modules/cargo/random_stock/t1_common.dm index c713ab2cf5a..dc3cd0843bb 100644 --- a/code/modules/cargo/random_stock/t1_common.dm +++ b/code/modules/cargo/random_stock/t1_common.dm @@ -217,7 +217,7 @@ STOCK_ITEM_COMMON(gloves, 3.3) ) exclusion += typesof(/obj/item/clothing/gloves/rig) exclusion += typesof(/obj/item/clothing/gloves/lightrig) - exclusion += typesof(/obj/item/clothing/gloves/watch) + exclusion += typesof(/obj/item/clothing/wrists/watch) exclusion += typesof(/obj/item/clothing/gloves/fluff) exclusion += typesof(/obj/item/clothing/gloves/ballistic) allgloves -= exclusion @@ -335,7 +335,7 @@ STOCK_ITEM_COMMON(suitcooler, 1.2) STOCK_ITEM_COMMON(paperwork, 1.2) if(prob(50)) - new /obj/item/hand_labeler(L) + new /obj/item/device/hand_labeler(L) else new /obj/item/clipboard(L) if(prob(15)) diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm index 0f3a4e5adee..92cdd878b7f 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm @@ -4,11 +4,6 @@ slot = slot_tie sort_category = "Accessories" -/datum/gear/accessory/bracelet - display_name = "bracelet (colourable)" - path = /obj/item/clothing/accessory/bracelet - flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION - /datum/gear/accessory/suspenders display_name = "suspenders" path = /obj/item/clothing/accessory/suspenders diff --git a/code/modules/client/preference_setup/loadout/loadout_gloves.dm b/code/modules/client/preference_setup/loadout/loadout_gloves.dm index 7dfea032601..d602315f51e 100644 --- a/code/modules/client/preference_setup/loadout/loadout_gloves.dm +++ b/code/modules/client/preference_setup/loadout/loadout_gloves.dm @@ -63,21 +63,6 @@ ringtype["ring, plastic"] = /obj/item/clothing/ring/material/plastic gear_tweaks += new/datum/gear_tweak/path(ringtype) -/datum/gear/gloves/watch - display_name = "watch selection" - description = "A selection of watches." - path = /obj/item/clothing/gloves/watch - -/datum/gear/gloves/watch/New() - ..() - var/watchtype = list() - watchtype["watch"] = /obj/item/clothing/gloves/watch - watchtype["silver watch"] = /obj/item/clothing/gloves/watch/silver - watchtype["gold watch"] = /obj/item/clothing/gloves/watch/gold - watchtype["spy watch"] = /obj/item/clothing/gloves/watch/spy - watchtype["pocketwatch"] = /obj/item/pocketwatch - gear_tweaks += new/datum/gear_tweak/path(watchtype) - /datum/gear/gloves/circuitry display_name = "gloves, circuitry (empty)" path = /obj/item/clothing/gloves/circuitry diff --git a/code/modules/client/preference_setup/loadout/loadout_wrists.dm b/code/modules/client/preference_setup/loadout/loadout_wrists.dm new file mode 100644 index 00000000000..10f93fbb85e --- /dev/null +++ b/code/modules/client/preference_setup/loadout/loadout_wrists.dm @@ -0,0 +1,31 @@ +/datum/gear/wrists + display_name = "bracelet" + path = /obj/item/clothing/wrists/bracelet + cost = 1 + slot = slot_wrists + sort_category = "Wristwear" + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION + +/datum/gear/wrists/beaded + display_name = "beaded bracelet" + path = /obj/item/clothing/wrists/beaded + +/datum/gear/wrists/slap + display_name = "slap bracelet" + path = /obj/item/clothing/wrists/slap + +/datum/gear/wrists/watch + display_name = "watch selection" + description = "A selection of watches." + path = /obj/item/clothing/wrists/watch + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION + +/datum/gear/wrists/watch/New() + ..() + var/watchtype = list() + watchtype["watch"] = /obj/item/clothing/wrists/watch + watchtype["silver watch"] = /obj/item/clothing/wrists/watch/silver + watchtype["gold watch"] = /obj/item/clothing/wrists/watch/gold + watchtype["spy watch"] = /obj/item/clothing/wrists/watch/spy + watchtype["pocketwatch"] = /obj/item/pocketwatch + gear_tweaks += new/datum/gear_tweak/path(watchtype) diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno/machine.dm b/code/modules/client/preference_setup/loadout/loadout_xeno/machine.dm index 1cb940dec54..f4c84b6f2bf 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno/machine.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno/machine.dm @@ -30,36 +30,34 @@ crest["crest, ruby"] = /obj/item/clothing/head/crest/ruby gear_tweaks += new/datum/gear_tweak/path(crest) -/datum/gear/gloves/armchains +/datum/gear/wrists/armchains display_name = "golden deep armchains" - path = /obj/item/clothing/gloves/armchain - cost = 1 + path = /obj/item/clothing/wrists/armchain whitelisted = list(SPECIES_IPC, SPECIES_IPC_G1, SPECIES_IPC_G2, SPECIES_IPC_XION, SPECIES_IPC_ZENGHU, SPECIES_IPC_BISHOP, SPECIES_IPC_SHELL) sort_category = "Xenowear - IPC" flags = GEAR_HAS_DESC_SELECTION -/datum/gear/gloves/armchains/New() +/datum/gear/wrists/armchains/New() ..() var/armchains = list() - armchains["arm chains, cobalt"] = /obj/item/clothing/gloves/armchain - armchains["arm chains, emerald"] = /obj/item/clothing/gloves/armchain/emerald - armchains["arm chains, ruby"] = /obj/item/clothing/gloves/armchain/ruby + armchains["arm chains, cobalt"] = /obj/item/clothing/wrists/armchain + armchains["arm chains, emerald"] = /obj/item/clothing/wrists/armchain/emerald + armchains["arm chains, ruby"] = /obj/item/clothing/wrists/armchain/ruby gear_tweaks += new/datum/gear_tweak/path(armchains) -/datum/gear/gloves/bracers +/datum/gear/wrists/bracers display_name = "golden deep bracers" - path = /obj/item/clothing/gloves/goldbracer - cost = 1 + path = /obj/item/clothing/wrists/goldbracer whitelisted = list(SPECIES_IPC, SPECIES_IPC_G1, SPECIES_IPC_G2, SPECIES_IPC_XION, SPECIES_IPC_ZENGHU, SPECIES_IPC_BISHOP, SPECIES_IPC_SHELL) sort_category = "Xenowear - IPC" flags = GEAR_HAS_DESC_SELECTION -/datum/gear/gloves/bracers/New() +/datum/gear/wrists/bracers/New() ..() var/bracers = list() - bracers["arm chains, cobalt"] = /obj/item/clothing/gloves/goldbracer - bracers["arm chains, emerald"] = /obj/item/clothing/gloves/goldbracer/emerald - bracers["arm chains, ruby"] = /obj/item/clothing/gloves/goldbracer/ruby + bracers["arm chains, cobalt"] = /obj/item/clothing/wrists/goldbracer + bracers["arm chains, emerald"] = /obj/item/clothing/wrists/goldbracer/emerald + bracers["arm chains, ruby"] = /obj/item/clothing/wrists/goldbracer/ruby gear_tweaks += new/datum/gear_tweak/path(bracers) /datum/gear/ears/antennae diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm b/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm index 6570ce0fbce..a50ec046cb0 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm @@ -34,12 +34,24 @@ ..() var/coat = list() coat["tajaran naval coat"] = /obj/item/clothing/suit/storage/toggle/tajaran - coat["commoner cloak"] = /obj/item/clothing/suit/storage/tajaran/cloak - coat["royal cloak"] = /obj/item/clothing/suit/storage/tajaran/cloak/fancy coat["gruff cloak"] = /obj/item/clothing/suit/storage/hooded/tajaran coat["adhomian wool coat"] = /obj/item/clothing/suit/storage/tajaran gear_tweaks += new/datum/gear_tweak/path(coat) +/datum/gear/suit/tajara_cloak + display_name = "tajara cloak selection" + description = "A selection of tajaran native cloaks." + path = /obj/item/clothing/accessory/poncho/tajarancloak + whitelisted = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI) + sort_category = "Xenowear - Tajara" + +/datum/gear/suit/tajara_cloak/New() + ..() + var/tajarancloak = list() + tajarancloak["common cloak"] = /obj/item/clothing/accessory/poncho/tajarancloak + tajarancloak["fancy cloak"] = /obj/item/clothing/accessory/poncho/tajarancloak/fancy + gear_tweaks += new/datum/gear_tweak/path(tajarancloak) + /datum/gear/suit/tajara_priest display_name = "tajaran religious suits selection" description = "A selection of tajaran religious robes." diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 4da74b3c2a7..cace2eebb53 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -335,7 +335,7 @@ slot_r_hand_str = 'icons/mob/items/clothing/righthand_gloves.dmi' ) siemens_coefficient = 0.75 - var/wired = 0 + var/wired = FALSE var/obj/item/cell/cell = 0 var/clipped = 0 var/fingerprint_chance = 0 @@ -372,7 +372,7 @@ /obj/item/clothing/gloves/attackby(obj/item/W, mob/user) ..() if(W.iswirecutter() || istype(W, /obj/item/surgery/scalpel)) - if (clipped) + if(clipped) to_chat(user, SPAN_NOTICE("\The [src] have already been clipped!")) update_icon() return @@ -1075,4 +1075,4 @@ gender = NEUTER drop_sound = 'sound/items/drop/ring.ogg' pickup_sound = 'sound/items/pickup/ring.ogg' - var/undergloves = 1 + var/undergloves = TRUE diff --git a/code/modules/clothing/clothing_accessories.dm b/code/modules/clothing/clothing_accessories.dm index b6796701ef4..5ec7264c512 100644 --- a/code/modules/clothing/clothing_accessories.dm +++ b/code/modules/clothing/clothing_accessories.dm @@ -63,11 +63,11 @@ usr.unEquip(C) switch(over_object.name) - if(BP_R_HAND) + if("right hand") if(istype(src, /obj/item/clothing/ears)) C = check_two_ears(usr) usr.put_in_r_hand(C) - if(BP_L_HAND) + if("left hand") if(istype(src, /obj/item/clothing/ears)) C = check_two_ears(usr) usr.put_in_l_hand(C) diff --git a/code/modules/clothing/factions/dominia.dm b/code/modules/clothing/factions/dominia.dm index 43dfd07d200..efe79644a14 100644 --- a/code/modules/clothing/factions/dominia.dm +++ b/code/modules/clothing/factions/dominia.dm @@ -382,3 +382,4 @@ name = "fisanduhian ushanka" desc = "A warm fur hat with ear flaps that can be raised and tied to be out of the way. This one has a large Fisanduhian flag on the front." icon_state = "fishushanka" + item_state = "fishushanka" diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 600f9fb677a..18be219ac4b 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -127,170 +127,6 @@ name = "tajaran leather gloves" species_restricted = list(BODYTYPE_TAJARA) -/obj/item/clothing/gloves/watch - name = "watch" - desc = "It's a GaussIo ZeitMeister, a finely tuned wristwatch encased in black plastic." - desc_fluff = "For those who want too much time on their wrists instead." - icon_state = "watch" - item_state = "watch" - w_class = ITEMSIZE_TINY - wired = 1 - species_restricted = null - gender = NEUTER - body_parts_covered = null - fingerprint_chance = 100 - var/flipped = 0 - drop_sound = 'sound/items/drop/accessory.ogg' - pickup_sound = 'sound/items/pickup/accessory.ogg' - -/obj/item/clothing/gloves/watch/silver - desc = "It's a GaussIo ZeitMeister, a finely tuned wristwatch encased in silver." - desc_fluff = "To unleash the telemarketer in you!" - icon_state = "watch_silver" - item_state = "watch_silver" - -/obj/item/clothing/gloves/watch/gold - desc = "It's a GaussIo ZeitMeister, a finely tuned wristwatch encased in REAL faux gold." - desc_fluff = "Be the jerk-ass pawn shop owner you'll never be." - icon_state = "watch_gold" - item_state = "watch_gold" - -/obj/item/clothing/gloves/watch/spy - desc = "It's a GENUINE Spy-Tech Invisi-watch! WARNING : Does not actually make you invisible." - desc_fluff = "Makes you want to wear a balaclava and smoke a cigarette." - icon_state = "watch_spy" - item_state = "watch_silver" - -/obj/item/clothing/gloves/watch/spy/checktime() - to_chat(usr, "You check your watch. Unfortunately for you, it's not a real watch, dork.") - -/obj/item/clothing/gloves/watch/examine(mob/user) - ..() - if (get_dist(src, user) <= 1) - checktime() - -/obj/item/clothing/gloves/watch/verb/checktime() - set category = "Object" - set name = "Check Time" - set src in usr - - if(wired && !clipped) - to_chat(usr, "You check your watch, spotting a digital collection of numbers reading '[worldtime2text()]'. Today's date is '[time2text(world.time, "Month DD")]. [game_year]'.") - if (emergency_shuttle.get_status_panel_eta()) - to_chat(usr, SPAN_WARNING("The shuttle's status is reported as: [emergency_shuttle.get_status_panel_eta()].")) - else if(wired && clipped) - to_chat(usr, "You check your watch, realising it's still open.") - else - to_chat(usr, "You check your watch as it dawns on you that it's broken.") - -/obj/item/clothing/gloves/watch/verb/pointatwatch() - set category = "Object" - set name = "Point At Watch" - set src in usr - - if(wired && !clipped) - usr.visible_message (SPAN_NOTICE("[usr] taps their foot on the floor, arrogantly pointing at the [src] on their wrist with a look of derision in their eyes."), SPAN_NOTICE("You point down at the [src], an arrogant look about your eyes.")) - else if(wired && clipped) - usr.visible_message (SPAN_NOTICE("[usr] taps their foot on the floor, arrogantly pointing at the [src] on their wrist with a look of derision in their eyes, not noticing it's open."), SPAN_NOTICE("You point down at the [src], an arrogant look about your eyes.")) - else - usr.visible_message (SPAN_NOTICE("[usr] taps their foot on the floor, arrogantly pointing at the [src] on their wrist with a look of derision in their eyes, not noticing it's broken."), SPAN_NOTICE("You point down at the [src], an arrogant look about your eyes.")) - -/obj/item/clothing/gloves/watch/verb/swapwrists() - set category = "Object" - set name = "Flip Watch Wrist" - set src in usr - - if (usr.stat || usr.restrained()) - return - - src.flipped = !src.flipped - if(src.flipped) - src.item_state = "[item_state]_alt" - else - src.item_state = initial(item_state) - to_chat(usr, "You change \the [src] to be on your [src.flipped ? "left" : "right"] hand.") - update_clothing_icon() - -/obj/item/clothing/gloves/watch/attackby(obj/item/W, mob/user) - if(W.isscrewdriver()) - if (clipped) //Using clipped because adding a new var for something is dumb - user.visible_message(SPAN_NOTICE("[user] screws the cover of the [src] closed."), SPAN_NOTICE("You screw the cover of the [src] closed.")) - clipped = 0 - return -// playsound(src.loc, 'sound/items/wirecutter.ogg', 100, 1) - user.visible_message(SPAN_NOTICE("[user] unscrews the cover of the [src]."), SPAN_NOTICE("You unscrew the cover of the [src].")) - clipped = 1 - return - if(wired) - return - if(W.iscoil()) - var/obj/item/stack/cable_coil/C = W - if (!clipped) - to_chat(user, SPAN_NOTICE("The [src] is not open.")) - return - - if(wired) - to_chat(user, SPAN_NOTICE("The [src] are already wired.")) - return - - if(C.amount < 2) - to_chat(user, SPAN_NOTICE("There is not enough wire to cover the [src].")) - return - - C.use(2) - wired = 1 - to_chat(user, SPAN_NOTICE("You repair some wires in the [src].")) - return - -/obj/item/clothing/gloves/watch/emp_act(severity) - if(prob(50/severity)) - wired = 0 - ..() - -/obj/item/clothing/gloves/armchain - name = "cobalt arm chains" - desc = "A set of luxurious chains intended to be wrapped around long, lanky arms. They don't seem particularly comfortable. They're encrusted with cobalt-blue gems, and made of REAL faux gold." - icon_state = "cobalt_armchains" - item_state = "cobalt_armchains" - siemens_coefficient = 1.0 - fingerprint_chance = 100 - drop_sound = 'sound/items/drop/accessory.ogg' - pickup_sound = 'sound/items/pickup/accessory.ogg' - -/obj/item/clothing/gloves/armchain/emerald - name = "emerald arm chains" - desc = "A set of luxurious chains intended to be wrapped around long, lanky arms. They don't seem particularly comfortable. They're encrusted with emerald-green gems, and made of REAL faux gold." - icon_state = "emerald_armchains" - item_state = "emerald_armchains" - -/obj/item/clothing/gloves/armchain/ruby - name = "ruby arm chains" - desc = "A set of luxurious chains intended to be wrapped around long, lanky arms. They don't seem particularly comfortable. They're encrusted with ruby-red gems, and made of REAL faux gold." - icon_state = "ruby_armchains" - item_state = "ruby_armchains" - -/obj/item/clothing/gloves/goldbracer - name = "cobalt bracers" - desc = "A pair of sturdy and thick decorative bracers, seeming better for fashion than protection. They're encrusted with cobalt-blue gems, and made of REAL faux gold." - icon_state = "cobalt_bracers" - item_state = "cobalt_bracers" - siemens_coefficient = 1.0 - fingerprint_chance = 100 - drop_sound = 'sound/items/drop/accessory.ogg' - pickup_sound = 'sound/items/pickup/accessory.ogg' - -/obj/item/clothing/gloves/goldbracer/emerald - name = "emerald bracers" - desc = "A pair of sturdy and thick decorative bracers, seeming better for fashion than protection. They're encrusted with emerald-green gems, and made of REAL faux gold." - icon_state = "emerald_bracers" - item_state = "emerald_bracers" - -/obj/item/clothing/gloves/goldbracer/ruby - name = "ruby bracers" - desc = "A pair of sturdy and thick decorative bracers, seeming better for fashion than protection. They're encrusted with ruby-red gems, and made of REAL faux gold." - icon_state = "ruby_bracers" - item_state = "ruby_bracers" - /* Forcegloves. They amplify force from melee hits as well as muck up disarm and stuff a little. Has bits of code in item_attack.dm, stungloves.dm, human_attackhand, human_defense diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index 2ca8728c56a..a82e8c9b532 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -42,7 +42,7 @@ allowed = list(/obj/item/device/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/device/suit_cooling_unit) slowdown = 3 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50) - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE siemens_coefficient = 0.5 diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index 2d2d91938d5..161b3ad5ac2 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -9,11 +9,6 @@ max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE siemens_coefficient = 0.5 - item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand.dmi', - slot_r_hand_str = 'icons/mob/items_righthand.dmi' - ) - //Species-specific stuff. species_restricted = list(BODYTYPE_HUMAN, BODYTYPE_IPC_BISHOP, BODYTYPE_IPC_ZENGHU) sprite_sheets_refit = list( @@ -45,11 +40,6 @@ max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE siemens_coefficient = 0.5 - item_icons = list( - slot_l_hand_str = 'icons/mob/items_lefthand.dmi', - slot_r_hand_str = 'icons/mob/items_righthand.dmi' - ) - species_restricted = list(BODYTYPE_HUMAN, BODYTYPE_SKRELL, BODYTYPE_IPC_BISHOP, BODYTYPE_IPC_ZENGHU) sprite_sheets_refit = list( BODYTYPE_UNATHI = 'icons/mob/species/unathi/suit.dmi', @@ -218,7 +208,7 @@ if(!istype(user,/mob/living)) return - if(istype(W,/obj/item/clothing/accessory) || istype(W, /obj/item/hand_labeler)) + if(istype(W,/obj/item/clothing/accessory) || istype(W, /obj/item/device/hand_labeler)) return ..() if(user.get_inventory_slot(src) == slot_wear_suit) diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 6b4c2de26ee..87efdd7cf55 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -149,7 +149,7 @@ allowed = list(/obj/item/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/handcuffs,/obj/item/tank/emergency_oxygen) slowdown = 1 armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 100, rad = 100) - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE siemens_coefficient = 0.35 @@ -557,7 +557,7 @@ w_class = ITEMSIZE_LARGE//bulky item body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/gun/energy,/obj/item/melee/baton,/obj/item/handcuffs,/obj/item/tank/emergency_oxygen) - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE siemens_coefficient = 0 @@ -571,13 +571,13 @@ gas_transfer_coefficient = 0.90 body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS slowdown = 3 - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT siemens_coefficient = 0.1 pocket_slots = 3 /obj/item/clothing/suit/armor/tdome body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT /obj/item/clothing/suit/armor/tdome/red name = "thunderdome suit (red)" diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index ad4dbee72d1..c5dcbfb74ff 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -27,7 +27,7 @@ slowdown = 1.0 allowed = list(/obj/item/tank/emergency_oxygen,/obj/item/pen,/obj/item/device/flashlight/pen) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20) - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL siemens_coefficient = 0.75 @@ -41,7 +41,7 @@ icon_state = "bio_general" desc = "A suit that protects against biological contamination and beestings." body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL //Virology biosuit, green stripe /obj/item/clothing/head/bio_hood/virology @@ -50,7 +50,7 @@ /obj/item/clothing/suit/bio_suit/virology icon_state = "bio_virology" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL //Security biosuit, grey with red stripe across the chest /obj/item/clothing/head/bio_hood/security @@ -59,7 +59,7 @@ /obj/item/clothing/suit/bio_suit/security icon_state = "bio_security" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL //Janitor's biosuit, grey with purple arms /obj/item/clothing/head/bio_hood/janitor @@ -68,7 +68,7 @@ /obj/item/clothing/suit/bio_suit/janitor icon_state = "bio_janitor" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL //Scientist's biosuit, white with a pink-ish hue @@ -78,13 +78,13 @@ /obj/item/clothing/suit/bio_suit/scientist icon_state = "bio_scientist" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL //CMO's biosuit, blue stripe /obj/item/clothing/suit/bio_suit/cmo icon_state = "bio_cmo" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL /obj/item/clothing/head/bio_hood/cmo icon_state = "bio_cmo" @@ -96,4 +96,4 @@ desc = "It protected doctors from the Black Death, back then. You bet your arse it's gonna help you against viruses." icon_state = "plaguedoctor" item_state = "bio_suit" - flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 192b94f74fa..67af7ba447e 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -55,14 +55,14 @@ item_state = "death" flags = CONDUCT fire_resist = T0C+5200 - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT /obj/item/clothing/suit/justice name = "justice suit" desc = "This pretty much looks ridiculous." icon_state = "justice" item_state = "justice" - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|HANDS|LEGS|FEET /obj/item/clothing/suit/judgerobe @@ -89,7 +89,7 @@ desc = "A plastic replica of the syndicate space suit, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!" w_class = ITEMSIZE_NORMAL allowed = list(/obj/item/device/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy) - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|HANDS|LEGS|FEET /obj/item/clothing/suit/imperium_monk @@ -117,7 +117,7 @@ icon_state = "monkeysuit" item_state = "monkeysuit" body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS|FEET|HANDS - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT siemens_coefficient = 1.5 @@ -154,7 +154,7 @@ icon_state = "straight_jacket" item_state = "straight_jacket" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|HANDS - flags_inv = HIDEGLOVES|HIDEJUMPSUIT + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDEJUMPSUIT /obj/item/clothing/suit/straight_jacket/equipped(var/mob/user, var/slot) if (slot == slot_wear_suit) @@ -189,7 +189,7 @@ icon_state = "xenos" item_state = "xenos_helm" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT siemens_coefficient = 1.5 /obj/item/clothing/suit/storage/toggle/bomber diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 9b796246511..f051a8a3e0a 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -21,7 +21,7 @@ siemens_coefficient = 0.5 allowed = list(/obj/item/device/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/extinguisher) slowdown = 1.0 - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS diff --git a/code/modules/clothing/suits/xeno/tajara.dm b/code/modules/clothing/suits/xeno/tajara.dm index d3bef226156..c0412a47a9c 100644 --- a/code/modules/clothing/suits/xeno/tajara.dm +++ b/code/modules/clothing/suits/xeno/tajara.dm @@ -24,20 +24,6 @@ to produce Human clothes are. There are a few notable branches, the long-coat and fedora \"gangster style\". Leather jacket wearing \"Greaser\" or the popular amongst females, short \ and colorful dress wearing \"Flapper\" variety of clothing." -/obj/item/clothing/suit/storage/tajaran/cloak - name = "commoner cloak" - desc = "A tajaran cloak made with the middle class in mind, fancy but nothing special." - icon = 'icons/obj/tajara_items.dmi' - icon_state = "taj_commoncloak" - item_state = "taj_commoncloak" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - -/obj/item/clothing/suit/storage/tajaran/cloak/fancy - name = "royal cloak" - desc = "A cloak fashioned from the best materials, meant for tajara of high standing." - icon_state = "taj_fancycloak" - item_state = "taj_fancycloak" - /obj/item/clothing/suit/storage/toggle/tajaran name = "tajaran naval coat" desc = "A thick wool coat from Adhomai." @@ -93,7 +79,7 @@ icon_state = "raskarasuit" item_state = "raskarasuit" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL + flags_inv = HIDEWRISTS|HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL species_restricted = list(BODYTYPE_TAJARA) desc_fluff = "Raskariim, commonly known as The Cult of Raskara are a prolific cult on Adhomai. The religion has been created on Adhomai but with the free commerce, a few human \ members have been recorded. While Raskara may seem like a single deity it is in fact split into three aspects, each one leading down a different path and seemingly every path \ @@ -185,4 +171,4 @@ item_state = "greenservice" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS armor = list(melee = 30, bullet = 20, laser = 20, energy = 10, bomb = 5, bio = 0, rad = 0) - siemens_coefficient = 0.50 + siemens_coefficient = 0.50 \ No newline at end of file diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 67108b8c637..bad23d7a30c 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -26,7 +26,7 @@ . = ..() if(build_from_parts) cut_overlays() - add_overlay(overlay_image(icon, "[icon_state]_[worn_overlay]", flags=RESET_COLOR)) //add the overlay w/o coloration of the original sprite + add_overlay(overlay_image(icon, worn_overlay, flags=RESET_COLOR)) //add the overlay w/o coloration of the original sprite /obj/item/clothing/accessory/proc/get_inv_overlay() if(!mob_overlay) @@ -44,7 +44,7 @@ inv_overlay.color = color if(build_from_parts) inv_overlay.cut_overlays() - inv_overlay.add_overlay(overlay_image(I, "[icon_state]_[worn_overlay]", flags=RESET_COLOR)) //add the overlay w/o coloration of the original sprite + inv_overlay.add_overlay(overlay_image(I, worn_overlay, flags=RESET_COLOR)) //add the overlay w/o coloration of the original sprite return inv_overlay /obj/item/clothing/accessory/proc/get_mob_overlay() @@ -61,7 +61,7 @@ mob_overlay.color = color if(build_from_parts) mob_overlay.cut_overlays() - mob_overlay.add_overlay(overlay_image(I, "[icon_state]_[worn_overlay]", flags=RESET_COLOR)) //add the overlay w/o coloration of the original sprite + mob_overlay.add_overlay(overlay_image(I, worn_overlay, flags=RESET_COLOR)) //add the overlay w/o coloration of the original sprite mob_overlay.appearance_flags = RESET_ALPHA return mob_overlay @@ -575,15 +575,6 @@ slot_flags = SLOT_TIE w_class = ITEMSIZE_TINY -/obj/item/clothing/accessory/bracelet - name = "bracelet" - desc = "A simple bracelet with a clasp." - icon_state = "bracelet" - w_class = ITEMSIZE_TINY - drop_sound = 'sound/items/drop/ring.ogg' - pickup_sound = 'sound/items/pickup/ring.ogg' - flippable = 1 - /obj/item/clothing/accessory/sleevepatch name = "sleeve patch" desc = "An embroidered patch which can be attached to the shoulder sleeve of clothing." diff --git a/code/modules/clothing/under/accessories/xeno/tajara.dm b/code/modules/clothing/under/accessories/xeno/tajara.dm index b26027d9d88..454a4ca1cd0 100644 --- a/code/modules/clothing/under/accessories/xeno/tajara.dm +++ b/code/modules/clothing/under/accessories/xeno/tajara.dm @@ -57,6 +57,26 @@ icon_state = "summer-shirt" item_state = "summer-shirt" +/obj/item/clothing/accessory/poncho/tajarancloak + name = "common cloak" + desc = "A tajaran cloak made with the middle class in mind, fancy but nothing special." + icon = 'icons/obj/tajara_items.dmi' + icon_state = "taj_commoncloak" + item_state = "taj_commoncloak" + desc_fluff = "Today the fashion that dominates Adhomai shares few similarities to the clothing of old Furs, linen, hemp, silk and other such fabrics were traded for \ + synthetic versions, creating a massive boom in the nylon industry and textile industry in the cities. Jeans, overcoats, army uniforms, parade uniforms, flags, pants, shirts, ties, \ + suspenders, overalls are now the fashion of every Tajara from Nal'Tor to Kaltir. The protests of \"Old fashion\" supporters can't stand against how undeniably effective and cheap \ + to produce Human clothes are. There are a few notable branches, the long-coat and fedora \"gangster style\". Leather jacket wearing \"Greaser\" or the popular amongst females, short \ + and colorful dress wearing \"Flapper\" variety of clothing." + icon_override = null + contained_sprite = TRUE + +/obj/item/clothing/accessory/poncho/tajarancloak/fancy + name = "fancy cloak" + desc = "A cloak fashioned from the best materials, meant for tajara of high standing." + icon_state = "taj_fancycloak" + item_state = "taj_fancycloak" + /obj/item/clothing/accessory/tajaran_wrap name = "marriage wrap" desc = "A holy cloth wrap that signifies marriage amongst tajara, it has white and gold markings. This one is meant for the husband." diff --git a/code/modules/clothing/wrists/watches.dm b/code/modules/clothing/wrists/watches.dm new file mode 100644 index 00000000000..5c3292fd9ff --- /dev/null +++ b/code/modules/clothing/wrists/watches.dm @@ -0,0 +1,92 @@ +/obj/item/clothing/wrists/watch + name = "watch" + desc = "It's a GaussIo ZeitMeister, a finely tuned wristwatch encased in black plastic." + desc_fluff = "For those who want too much time on their wrists instead." + icon_state = "watch" + item_state = "watch" + var/wired = TRUE + var/screwed = TRUE + +/obj/item/clothing/wrists/watch/silver + desc = "It's a GaussIo ZeitMeister, a finely tuned wristwatch encased in silver." + desc_fluff = "To unleash the telemarketer in you!" + icon_state = "watch_silver" + item_state = "watch_silver" + +/obj/item/clothing/wrists/watch/gold + desc = "It's a GaussIo ZeitMeister, a finely tuned wristwatch encased in REAL faux gold." + desc_fluff = "Be the jerk-ass pawn shop owner you'll never be." + icon_state = "watch_gold" + item_state = "watch_gold" + +/obj/item/clothing/wrists/watch/spy + desc = "It's a GENUINE Spy-Tech Invisi-watch! WARNING : Does not actually make you invisible." + desc_fluff = "Makes you want to wear a balaclava and smoke a cigarette." + icon_state = "watch_spy" + item_state = "watch_silver" + +/obj/item/clothing/wrists/watch/spy/checktime() + to_chat(usr, "You check your watch. Unfortunately for you, it's not a real watch, dork.") + +/obj/item/clothing/wrists/watch/examine(mob/user) + ..() + if (get_dist(src, user) <= 1) + checktime() + +/obj/item/clothing/wrists/watch/verb/checktime() + set category = "Object" + set name = "Check Time" + set src in usr + + if(wired && screwed) + to_chat(usr, "You check your watch, spotting a digital collection of numbers reading '[worldtime2text()]'. Today's date is '[time2text(world.time, "Month DD")]. [game_year]'.") + if (emergency_shuttle.get_status_panel_eta()) + to_chat(usr, SPAN_WARNING("The shuttle's status is reported as: [emergency_shuttle.get_status_panel_eta()].")) + else if(wired && !screwed) + to_chat(usr, "You check your watch, realising it's still open.") + else + to_chat(usr, "You check your watch as it dawns on you that it's broken.") + +/obj/item/clothing/wrists/watch/verb/pointatwatch() + set category = "Object" + set name = "Point At Watch" + set src in usr + + if(wired && screwed) + usr.visible_message (SPAN_NOTICE("[usr] taps their foot on the floor, arrogantly pointing at the [src] on their wrist with a look of derision in their eyes"), SPAN_NOTICE("You point down at the [src] with an arrogant look about your eyes.")) + else if(wired && !screwed) + usr.visible_message (SPAN_NOTICE("[usr] taps their foot on the floor, arrogantly pointing at the [src] on their wrist with a look of derision in their eyes, not noticing it's open."), SPAN_NOTICE("You point down at the [src] with an arrogant look about your eyes.")) + else + usr.visible_message (SPAN_NOTICE("[usr] taps their foot on the floor, arrogantly pointing at the [src] on their wrist with a look of derision in their eyes, not noticing it's broken."), SPAN_NOTICE("You point down at the [src] with an arrogant look about your eyes.")) + +/obj/item/clothing/wrists/watch/attackby(obj/item/W, mob/user) + if(W.isscrewdriver()) + user.visible_message(SPAN_NOTICE("[user] [screwed ? "unscrews" : "screws"] the cover of the [src] [screwed ? "open" : "closed"]."), SPAN_NOTICE("You [screwed ? "unscrews" : "screws"] the cover of the [src] [screwed ? "open" : "closed"].")) + playsound(src.loc, 'sound/items/screwdriver.ogg', 100, 1) + screwed = !screwed + return + if(wired) + return + if(W.iscoil()) + var/obj/item/stack/cable_coil/C = W + if(screwed) + to_chat(user, SPAN_NOTICE("The [src] is not open.")) + return + + if(wired) + to_chat(user, SPAN_NOTICE("The [src] are already wired.")) + return + + if(C.amount < 2) + to_chat(user, SPAN_NOTICE("There is not enough wire to cover the [src].")) + return + + C.use(2) + wired = TRUE + to_chat(user, SPAN_NOTICE("You repair some wires in the [src].")) + return + +/obj/item/clothing/wrists/watch/emp_act(severity) + if(prob(50/severity)) + wired = FALSE + ..() diff --git a/code/modules/clothing/wrists/wrists.dm b/code/modules/clothing/wrists/wrists.dm new file mode 100644 index 00000000000..f3d31b18f21 --- /dev/null +++ b/code/modules/clothing/wrists/wrists.dm @@ -0,0 +1,105 @@ + +/obj/item/clothing/wrists + name = "wrists" + w_class = ITEMSIZE_TINY + icon = 'icons/obj/clothing/wrists.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/clothing/lefthand_wrists.dmi', + slot_r_hand_str = 'icons/mob/items/clothing/righthand_wrists.dmi' + ) + slot_flags = SLOT_WRISTS + drop_sound = 'sound/items/drop/accessory.ogg' + pickup_sound = 'sound/items/pickup/accessory.ogg' + siemens_coefficient = 1.0 + var/flipped = 0 + +/obj/item/clothing/wrists/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_wrists() + +/obj/item/clothing/wrists/Initialize() + ..() + update_flip_verb() + +/obj/item/clothing/wrists/proc/update_flip_verb() + if((gender != PLURAL) && (flipped != -1)) // Check for plurality and whether it has a flipped icon. + verbs += /obj/item/clothing/wrists/watch/proc/swapwrists + +/obj/item/clothing/wrists/watch/proc/swapwrists() + set category = "Object" + set name = "Flip Wristwear" + set src in usr + + if(use_check_and_message(usr)) + return 0 + + flipped = !flipped + if(("[initial(icon_state)]_flip") in icon_states(icon)) + icon_state = "[initial(item_state)][flipped ? "_flip" : ""]" + item_state = "[initial(item_state)][flipped ? "_flip" : ""]" + to_chat(usr, "You change \the [src] to be on your [src.flipped ? "left" : "right"] wrist.") + if(equip_sound) + playsound(src, equip_sound, EQUIP_SOUND_VOLUME) + else + playsound(src, drop_sound, DROP_SOUND_VOLUME) + update_clothing_icon() + +/obj/item/clothing/wrists/bracelet + name = "bracelet" + desc = "Made out of some synthetic polymer. Management encourages you to not ask questions." + icon_state = "bracelet" + item_state = "bracelet" + +/obj/item/clothing/wrists/beaded + name = "beaded bracelet" + desc = "Made from loose beads with a center hole and connected by a piece of string or elastic band through said holes." + icon_state = "beaded" + item_state = "beaded" + +/obj/item/clothing/wrists/slap + name = "slap bracelet" + desc = "Banned in schools! Popular with children and in poorly managed corporate events!" + equip_sound = 'sound/effects/snap.ogg' + icon_state = "slap" + item_state = "slap" + +/obj/item/clothing/wrists/armchain + name = "cobalt arm chains" + desc = "A set of luxurious chains intended to be wrapped around long, lanky arms. They don't seem particularly comfortable. They're encrusted with cobalt-blue gems, and made of REAL faux gold." + icon_state = "cobalt_armchains" + item_state = "cobalt_armchains" + gender = PLURAL + flipped = -1 + +/obj/item/clothing/wrists/armchain/emerald + name = "emerald arm chains" + desc = "A set of luxurious chains intended to be wrapped around long, lanky arms. They don't seem particularly comfortable. They're encrusted with emerald-green gems, and made of REAL faux gold." + icon_state = "emerald_armchains" + item_state = "emerald_armchains" + +/obj/item/clothing/wrists/armchain/ruby + name = "ruby arm chains" + desc = "A set of luxurious chains intended to be wrapped around long, lanky arms. They don't seem particularly comfortable. They're encrusted with ruby-red gems, and made of REAL faux gold." + icon_state = "ruby_armchains" + item_state = "ruby_armchains" + +/obj/item/clothing/wrists/goldbracer + name = "cobalt bracers" + desc = "A pair of sturdy and thick decorative bracers, seeming better for fashion than protection. They're encrusted with cobalt-blue gems, and made of REAL faux gold." + icon_state = "cobalt_bracers" + item_state = "cobalt_bracers" + gender = PLURAL + flipped = -1 + +/obj/item/clothing/wrists/goldbracer/emerald + name = "emerald bracers" + desc = "A pair of sturdy and thick decorative bracers, seeming better for fashion than protection. They're encrusted with emerald-green gems, and made of REAL faux gold." + icon_state = "emerald_bracers" + item_state = "emerald_bracers" + +/obj/item/clothing/wrists/goldbracer/ruby + name = "ruby bracers" + desc = "A pair of sturdy and thick decorative bracers, seeming better for fashion than protection. They're encrusted with ruby-red gems, and made of REAL faux gold." + icon_state = "ruby_bracers" + item_state = "ruby_bracers" diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 55892bc8821..743578d6706 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -451,7 +451,7 @@ All custom items with worn sprites must follow the contained sprite system: http contained_sprite = TRUE -/obj/item/clothing/gloves/watch/fluff/rex_watch //Engraved Wristwatch - Rex Winters - tailson +/obj/item/clothing/wrists/watch/fluff/rex_watch //Engraved Wristwatch - Rex Winters - tailson name = "engraved wristwatch" desc = "A fine gold watch. On the inside is an engraving that reads \"Happy birthday dad, thinking of you always\"." icon = 'icons/obj/custom_items/rex_watch.dmi' diff --git a/code/modules/ghostroles/spawner/human/emergencypod.dm b/code/modules/ghostroles/spawner/human/emergencypod.dm index c57ca54770d..1618d326bc3 100644 --- a/code/modules/ghostroles/spawner/human/emergencypod.dm +++ b/code/modules/ghostroles/spawner/human/emergencypod.dm @@ -262,10 +262,10 @@ ) gloves = list( - /obj/item/clothing/gloves/watch, - /obj/item/clothing/gloves/watch/silver, - /obj/item/clothing/gloves/watch/gold, - /obj/item/clothing/gloves/watch/spy + /obj/item/clothing/wrists/watch, + /obj/item/clothing/wrists/watch/silver, + /obj/item/clothing/wrists/watch/gold, + /obj/item/clothing/wrists/watch/spy ) l_pocket = /obj/item/syndie/teleporter diff --git a/code/modules/global_listener/devices.dm b/code/modules/global_listener/devices.dm index 0d6afeb6982..6dfd32e9c67 100644 --- a/code/modules/global_listener/devices.dm +++ b/code/modules/global_listener/devices.dm @@ -114,7 +114,7 @@ //------------------------------- /datum/wifi/receiver/button/crematorium/activate(mob/living/user) ..() - var/obj/structure/crematorium/C = parent + var/obj/structure/morgue/crematorium/C = parent if(istype(C)) C.cremate(user) diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index 9999764eda6..3ef3c66be0a 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -32,7 +32,6 @@ var/savefile/iconCache = new("data/tmp/iconCache.sav") //Cache of icons for the * Async because this is called from Client/New. */ /datum/chatOutput/proc/start() - set waitfor = FALSE //Check for existing chat if(!owner) return FALSE diff --git a/code/modules/hydroponics/seed_datums/fruits.dm b/code/modules/hydroponics/seed_datums/fruits.dm index 99c6eceb160..6e7e0ac109b 100644 --- a/code/modules/hydroponics/seed_datums/fruits.dm +++ b/code/modules/hydroponics/seed_datums/fruits.dm @@ -239,7 +239,7 @@ seed_name = "golden apple" display_name = "gold apple tree" mutants = null - chems = list(/decl/reagent/drink/applejuice = list(1,10), MATERIAL_GOLD = list(1,5)) + chems = list(/decl/reagent/drink/applejuice = list(1,10), /decl/reagent/gold = list(1,5)) kitchen_tag = "goldapple" /datum/seed/apple/gold/setup_traits() diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm index a6a064b913b..528cee01640 100644 --- a/code/modules/item_worth/worths_list.dm +++ b/code/modules/item_worth/worths_list.dm @@ -712,7 +712,7 @@ var/list/worths = list( /obj/structure/kitchenspike = 35, /obj/structure/lattice = 1, /obj/structure/morgue = 100, - /obj/structure/crematorium = 600, + /obj/structure/morgue/crematorium = 600, /obj/structure/device/piano = 1200, //pianos are expensive, /obj/structure/noticeboard = 15, /obj/structure/safe/floor = 180, diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index db00e67e8b3..0e62b0def28 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -142,9 +142,6 @@ /obj/structure/bookcase/libraryspawn/nonfiction spawn_category = "Non-Fiction" -/obj/structure/bookcase/libraryspawn/adult - spawn_category = "Adult" - /obj/structure/bookcase/libraryspawn/reference spawn_category = "Reference" diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 98606f87fbe..49c03a1f308 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -84,7 +84,8 @@ var/list/slot_equipment_priority = list( \ slot_s_store,\ slot_tie,\ slot_l_store,\ - slot_r_store\ + slot_r_store,\ + slot_wrists\ ) //Checks if a given slot can be accessed at this time, either to equip or unequip I @@ -272,7 +273,7 @@ var/list/slot_equipment_priority = list( \ /mob/proc/get_inventory_slot(obj/item/I) var/slot = 0 - for(var/s in slot_back to slot_tie) //kind of worries me + for(var/s in slot_first to slot_last) //kind of worries me if(get_equipped_item(s) == I) slot = s break @@ -397,11 +398,6 @@ var/list/slot_equipment_priority = list( \ if((istype(src.loc, /turf/space)) || (src.lastarea.has_gravity() == 0)) src.inertia_dir = get_dir(target, src) step(src, inertia_dir) -/* - if(istype(src.loc, /turf/space) || (src.flags & NOGRAV)) //they're in space, move em one space in the opposite direction - src.inertia_dir = get_dir(target, src) - step(src, inertia_dir) -*/ if(istype(item,/obj/item)) var/obj/item/W = item W.randpixel_xy() diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index b47def924e1..08f94c1c752 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -27,6 +27,7 @@ var/skipmask = skipitems & HIDEMASK var/skipeyes = skipitems & HIDEEYES var/skipears = skipitems & HIDEEARS + var/skipwrists = skipitems & HIDEWRISTS var/list/msg = list("*---------*\nThis is ") @@ -53,7 +54,7 @@ for(var/accessory in U.accessories) if(istype(accessory, /obj/item/clothing/accessory/holster)) //so you can't see what kind of gun a holster is holding from afar accessory_descs += "\a [accessory]" - else + else accessory_descs += "\a [accessory]" tie_msg += " [lowertext(english_list(accessory_descs))]" @@ -194,6 +195,10 @@ var/id_name = wear_id msg += "[get_pronoun("He")] [get_pronoun("is")] wearing [icon2html(wear_id, user)] \a [id_name].\n" + //wrists + if(wrists && !skipwrists) + msg += "[get_pronoun("He")] [get_pronoun("is")] wearing [icon2html(wrists, user)] \a [wrists] on [get_pronoun("his")] [wrists.gender==PLURAL?"wrists":"wrist"].\n" + //Jitters if(is_jittery) if(jitteriness >= 300) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index df7d9f3fcd7..e644bba8e65 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -67,6 +67,7 @@ var/obj/item/r_store = null var/obj/item/l_store = null var/obj/item/s_store = null + var/obj/item/wrists = null var/used_skillpoints = 0 var/skill_specialization = null diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 73a36b26a0e..f62d0ecbcb6 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -82,6 +82,8 @@ This saves us from having to call add_fingerprint() any time something is put in return 1 if(slot_in_belt) return 1 + if(slot_wrists) + return has_organ(BP_L_ARM) || has_organ(BP_R_ARM) /mob/living/carbon/human/u_equip(obj/W as obj) if(!W) return 0 @@ -111,6 +113,9 @@ This saves us from having to call add_fingerprint() any time something is put in else if (W == gloves) gloves = null update_inv_gloves() + else if (W == wrists) + wrists = null + update_inv_wrists() else if (W == glasses) glasses = null update_inv_glasses() @@ -258,6 +263,10 @@ This saves us from having to call add_fingerprint() any time something is put in src.gloves = W W.equipped(src, slot) update_inv_gloves(redraw_mob) + if(slot_wrists) + src.wrists = W + W.equipped(src, slot) + update_inv_wrists(redraw_mob) if(slot_head) src.head = W if(head.flags_inv & (BLOCKHAIR|BLOCKHEADHAIR|HIDEMASK)) @@ -306,7 +315,7 @@ This saves us from having to call add_fingerprint() any time something is put in var/obj/item/clothing/under/uniform = src.w_uniform uniform.attackby(W,src) else - to_chat(src, "You are trying to eqip this item to an unsupported inventory slot. If possible, please write a ticket with steps to reproduce. Slot was: [slot]") + to_chat(src, "You are trying to equip this item to an unsupported inventory slot. If possible, please write a ticket with steps to reproduce. Slot was: [slot]") return if((W == src.l_hand) && (slot != slot_l_hand)) @@ -335,7 +344,7 @@ This saves us from having to call add_fingerprint() any time something is put in if(slot_glasses) covering = src.head check_flags = EYES - if(slot_gloves, slot_w_uniform) + if(slot_gloves, slot_wrists, slot_w_uniform) covering = src.wear_suit if(slot_l_ear, slot_r_ear) covering = src.head @@ -367,6 +376,7 @@ This saves us from having to call add_fingerprint() any time something is put in if(slot_s_store) return s_store if(slot_l_ear) return l_ear if(slot_r_ear) return r_ear + if(slot_wrists) return wrists return ..() /mob/living/carbon/human/get_equipped_items(var/include_carried = 0) @@ -384,6 +394,7 @@ This saves us from having to call add_fingerprint() any time something is put in if(wear_mask) items += wear_mask if(wear_suit) items += wear_suit if(w_uniform) items += w_uniform + if(wrists) items += wrists if(include_carried) if(l_hand) items += l_hand diff --git a/code/modules/mob/living/carbon/human/species/species_hud.dm b/code/modules/mob/living/carbon/human/species/species_hud.dm index 76c6322b332..9b0a909c273 100644 --- a/code/modules/mob/living/carbon/human/species/species_hud.dm +++ b/code/modules/mob/living/carbon/human/species/species_hud.dm @@ -20,21 +20,22 @@ // to be drawn for the mob. This is fairly delicate, try to avoid messing with it // unless you know exactly what it does. var/list/gear = list( - "i_clothing" = list("loc" = ui_iclothing, "name" = "Uniform", "slot" = slot_w_uniform, "state" = "center", "toggle" = 1), - "o_clothing" = list("loc" = ui_oclothing, "name" = "Suit", "slot" = slot_wear_suit, "state" = "suit", "toggle" = 1), - "mask" = list("loc" = ui_mask, "name" = "Mask", "slot" = slot_wear_mask, "state" = "mask", "toggle" = 1), - "gloves" = list("loc" = ui_gloves, "name" = "Gloves", "slot" = slot_gloves, "state" = "gloves", "toggle" = 1), - "eyes" = list("loc" = ui_glasses, "name" = "Glasses", "slot" = slot_glasses, "state" = "glasses","toggle" = 1), - "l_ear" = list("loc" = ui_l_ear, "name" = "Left Ear", "slot" = slot_l_ear, "state" = "ears", "toggle" = 1), - "r_ear" = list("loc" = ui_r_ear, "name" = "Right Ear", "slot" = slot_r_ear, "state" = "ears", "toggle" = 1), - "head" = list("loc" = ui_head, "name" = "Hat", "slot" = slot_head, "state" = "hair", "toggle" = 1), - "shoes" = list("loc" = ui_shoes, "name" = "Shoes", "slot" = slot_shoes, "state" = "shoes", "toggle" = 1), - "suit storage" = list("loc" = ui_sstore1, "name" = "Suit Storage", "slot" = slot_s_store, "state" = "suitstore"), - "back" = list("loc" = ui_back, "name" = "Back", "slot" = slot_back, "state" = "back"), - "id" = list("loc" = ui_id, "name" = "ID", "slot" = slot_wear_id, "state" = "id"), - "storage1" = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = slot_l_store, "state" = "pocket"), - "storage2" = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = slot_r_store, "state" = "pocket"), - "belt" = list("loc" = ui_belt, "name" = "Belt", "slot" = slot_belt, "state" = "belt") + "i_clothing" = list("loc" = ui_iclothing, "name" = "uniform", "slot" = slot_w_uniform, "state" = "center", "toggle" = 1), + "o_clothing" = list("loc" = ui_oclothing, "name" = "suit", "slot" = slot_wear_suit, "state" = "suit", "toggle" = 1), + "mask" = list("loc" = ui_mask, "name" = "mask", "slot" = slot_wear_mask, "state" = "mask", "toggle" = 1), + "gloves" = list("loc" = ui_gloves, "name" = "gloves", "slot" = slot_gloves, "state" = "gloves", "toggle" = 1), + "eyes" = list("loc" = ui_glasses, "name" = "glasses", "slot" = slot_glasses, "state" = "glasses","toggle" = 1), + "l_ear" = list("loc" = ui_l_ear, "name" = "left ear", "slot" = slot_l_ear, "state" = "l_ear", "toggle" = 1), + "r_ear" = list("loc" = ui_r_ear, "name" = "right ear", "slot" = slot_r_ear, "state" = "r_ear", "toggle" = 1), + "head" = list("loc" = ui_head, "name" = "hat", "slot" = slot_head, "state" = "hair", "toggle" = 1), + "shoes" = list("loc" = ui_shoes, "name" = "shoes", "slot" = slot_shoes, "state" = "shoes", "toggle" = 1), + "wrists" = list("loc" = ui_wrists, "name" = "wrists", "slot" = slot_wrists, "state" = "wrists", "toggle" = 1), + "suit storage" = list("loc" = ui_sstore1, "name" = "suit storage", "slot" = slot_s_store, "state" = "suitstore"), + "back" = list("loc" = ui_back, "name" = "back", "slot" = slot_back, "state" = "back"), + "id" = list("loc" = ui_id, "name" = "id", "slot" = slot_wear_id, "state" = "id"), + "storage1" = list("loc" = ui_storage1, "name" = "left pocket", "slot" = slot_l_store, "state" = "pocket"), + "storage2" = list("loc" = ui_storage2, "name" = "right pocket", "slot" = slot_r_store, "state" = "pocket"), + "belt" = list("loc" = ui_belt, "name" = "belt", "slot" = slot_belt, "state" = "belt") ) /datum/hud_data/New() @@ -53,7 +54,6 @@ if(slot_w_uniform in equip_slots) equip_slots |= slot_tie - if(slot_belt in equip_slots) equip_slots |= slot_in_belt @@ -63,25 +63,25 @@ has_hydration = FALSE has_internals = FALSE gear = list( - "i_clothing" = list("loc" = ui_iclothing, "name" = "Uniform", "slot" = slot_w_uniform, "state" = "center", "toggle" = 1), - "o_clothing" = list("loc" = ui_shoes, "name" = "Suit", "slot" = slot_wear_suit, "state" = "suit", "toggle" = 1), - "l_ear" = list("loc" = ui_glasses, "name" = "Left Ear", "slot" = slot_l_ear, "state" = "ears", "toggle" = 1), - "r_ear" = list("loc" = ui_l_ear, "name" = "Right Ear", "slot" = slot_r_ear, "state" = "ears", "toggle" = 1), - "head" = list("loc" = ui_mask, "name" = "Hat", "slot" = slot_head, "state" = "hair", "toggle" = 1), - "suit storage" = list("loc" = ui_sstore1, "name" = "Suit Storage", "slot" = slot_s_store, "state" = "suitstore"), - "back" = list("loc" = ui_back, "name" = "Back", "slot" = slot_back, "state" = "back"), - "id" = list("loc" = ui_id, "name" = "ID", "slot" = slot_wear_id, "state" = "id"), - "storage1" = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = slot_l_store, "state" = "pocket"), - "storage2" = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = slot_r_store, "state" = "pocket"), - "belt" = list("loc" = ui_belt, "name" = "Belt", "slot" = slot_belt, "state" = "belt"), - "mask" = list("loc" = ui_oclothing, "name" = "Mask", "slot" = slot_wear_mask, "state" = "mask", "toggle" = 1), - "eyes" = list("loc" = ui_gloves, "name" = "Glasses", "slot" = slot_glasses, "state" = "glasses","toggle" = 1) + "i_clothing" = list("loc" = ui_iclothing, "name" = "uniform", "slot" = slot_w_uniform, "state" = "center", "toggle" = 1), + "o_clothing" = list("loc" = ui_shoes, "name" = "suit", "slot" = slot_wear_suit, "state" = "suit", "toggle" = 1), + "l_ear" = list("loc" = ui_glasses, "name" = "left ear", "slot" = slot_l_ear, "state" = "l_ear", "toggle" = 1), + "r_ear" = list("loc" = ui_l_ear, "name" = "right ear", "slot" = slot_r_ear, "state" = "r_ear", "toggle" = 1), + "head" = list("loc" = ui_mask, "name" = "hat", "slot" = slot_head, "state" = "hair", "toggle" = 1), + "suit storage" = list("loc" = ui_sstore1, "name" = "suit storage", "slot" = slot_s_store, "state" = "suitstore"), + "back" = list("loc" = ui_back, "name" = "back", "slot" = slot_back, "state" = "back"), + "id" = list("loc" = ui_id, "name" = "id", "slot" = slot_wear_id, "state" = "id"), + "storage1" = list("loc" = ui_storage1, "name" = "left Pocket", "slot" = slot_l_store, "state" = "pocket"), + "storage2" = list("loc" = ui_storage2, "name" = "right Pocket", "slot" = slot_r_store, "state" = "pocket"), + "belt" = list("loc" = ui_belt, "name" = "belt", "slot" = slot_belt, "state" = "belt"), + "mask" = list("loc" = ui_oclothing, "name" = "mask", "slot" = slot_wear_mask, "state" = "mask", "toggle" = 1), + "eyes" = list("loc" = ui_gloves, "name" = "glasses", "slot" = slot_glasses, "state" = "glasses","toggle" = 1) ) /datum/hud_data/monkey gear = list( - "mask" = list("loc" = ui_shoes, "name" = "Mask", "slot" = slot_wear_mask, "state" = "mask", "toggle" = 1), - "back" = list("loc" = ui_sstore1, "name" = "Back", "slot" = slot_back, "state" = "back") + "mask" = list("loc" = ui_shoes, "name" = "mask", "slot" = slot_wear_mask, "state" = "mask", "toggle" = 1), + "back" = list("loc" = ui_sstore1, "name" = "back", "slot" = slot_back, "state" = "back") ) @@ -92,4 +92,4 @@ /datum/hud_data/construct has_hydration = FALSE - has_nutrition = FALSE \ No newline at end of file + has_nutrition = FALSE diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index ec94ec189f9..e6c1683f075 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -113,8 +113,9 @@ There are several things that need to be remembered: #define LEGCUFF_LAYER 26 #define L_HAND_LAYER 27 #define R_HAND_LAYER 28 -#define FIRE_LAYER 29 //If you're on fire -#define TOTAL_LAYERS 29 +#define WRISTS_LAYER 29 +#define FIRE_LAYER 30 //If you're on fire +#define TOTAL_LAYERS 30 ////////////////////////////////// #define UNDERSCORE_OR_NULL(target) "[target ? "[target]_" : ""]" @@ -517,6 +518,7 @@ There are several things that need to be remembered: update_fire(FALSE) update_surgery(FALSE) update_underwear(FALSE) + update_inv_wrists(FALSE) UpdateDamageIcon() update_icon() //Hud Stuff @@ -1253,6 +1255,58 @@ There are several things that need to be remembered: if(update_icons) update_icon() +/mob/living/carbon/human/update_inv_l_hand(var/update_icons=1) + if (QDELING(src)) + return + + overlays_raw[L_HAND_LAYER] = null + if(l_hand) + l_hand.screen_loc = ui_lhand //TODO + + //determine icon state to use + var/t_state = l_hand.item_state || l_hand.icon_state + + var/image/result_layer + if(l_hand.contained_sprite) + l_hand.auto_adapt_species(src) + t_state = "[UNDERSCORE_OR_NULL(l_hand.icon_species_tag)][l_hand.item_state][WORN_LHAND]" + + result_layer = image(l_hand.icon_override || l_hand.icon, t_state) + + if(l_hand.color) + result_layer.color = l_hand.color + + result_layer.appearance_flags = RESET_ALPHA + overlays_raw[L_HAND_LAYER] = result_layer + else + if(l_hand.item_state_slots && l_hand.item_state_slots[slot_l_hand_str]) + t_state = l_hand.item_state_slots[slot_l_hand_str] + + //determine icon to use + var/icon/t_icon + if(l_hand.item_icons && (slot_l_hand_str in l_hand.item_icons)) + t_icon = l_hand.item_icons[slot_l_hand_str] + else if(l_hand.icon_override) + t_state += WORN_LHAND + t_icon = l_hand.icon_override + else + t_icon = INV_L_HAND_DEF_ICON + + result_layer = image(t_icon, t_state) + + if(l_hand.color) + result_layer.color = l_hand.color + + var/image/worn_overlays = l_hand.worn_overlays(t_icon) + if(worn_overlays) + result_layer.overlays.Add(worn_overlays) + + result_layer.appearance_flags = RESET_ALPHA + overlays_raw[L_HAND_LAYER] = result_layer + + if(update_icons) + update_icon() + /mob/living/carbon/human/update_inv_r_hand(var/update_icons=1) if (QDELING(src)) return @@ -1305,54 +1359,54 @@ There are several things that need to be remembered: if(update_icons) update_icon() -/mob/living/carbon/human/update_inv_l_hand(var/update_icons=1) +/mob/living/carbon/human/update_inv_wrists(var/update_icons=1) if (QDELING(src)) return - overlays_raw[L_HAND_LAYER] = null - if(l_hand) - l_hand.screen_loc = ui_lhand //TODO + overlays_raw[WRISTS_LAYER] = null + if(check_draw_wrists()) + wrists.screen_loc = ui_lhand //TODO //determine icon state to use - var/t_state = l_hand.item_state || l_hand.icon_state + var/t_state = wrists.item_state || wrists.icon_state var/image/result_layer - if(l_hand.contained_sprite) - l_hand.auto_adapt_species(src) - t_state = "[UNDERSCORE_OR_NULL(l_hand.icon_species_tag)][l_hand.item_state][WORN_LHAND]" + if(wrists.contained_sprite) + wrists.auto_adapt_species(src) + t_state = "[UNDERSCORE_OR_NULL(wrists.icon_species_tag)][wrists.item_state][WORN_WRISTS]" - result_layer = image(l_hand.icon_override || l_hand.icon, t_state) + result_layer = image(wrists.icon_override || wrists.icon, t_state) - if(l_hand.color) - result_layer.color = l_hand.color + if(wrists.color) + result_layer.color = wrists.color result_layer.appearance_flags = RESET_ALPHA - overlays_raw[L_HAND_LAYER] = result_layer + overlays_raw[WRISTS_LAYER] = result_layer else - if(l_hand.item_state_slots && l_hand.item_state_slots[slot_l_hand_str]) - t_state = l_hand.item_state_slots[slot_l_hand_str] + if(wrists.item_state_slots && wrists.item_state_slots[slot_wrists_str]) + t_state = wrists.item_state_slots[slot_wrists_str] //determine icon to use var/icon/t_icon - if(l_hand.item_icons && (slot_l_hand_str in l_hand.item_icons)) - t_icon = l_hand.item_icons[slot_l_hand_str] - else if(l_hand.icon_override) - t_state += WORN_LHAND - t_icon = l_hand.icon_override + if(wrists.item_icons && (slot_wrists_str in wrists.item_icons)) + t_icon = wrists.item_icons[slot_wrists_str] + else if(wrists.icon_override) + t_state += WORN_WRISTS + t_icon = wrists.icon_override else - t_icon = INV_L_HAND_DEF_ICON + t_icon = INV_WRISTS_DEF_ICON result_layer = image(t_icon, t_state) - if(l_hand.color) - result_layer.color = l_hand.color + if(wrists.color) + result_layer.color = wrists.color - var/image/worn_overlays = l_hand.worn_overlays(t_icon) + var/image/worn_overlays = wrists.worn_overlays(t_icon) if(worn_overlays) result_layer.overlays.Add(worn_overlays) result_layer.appearance_flags = RESET_ALPHA - overlays_raw[L_HAND_LAYER] = result_layer + overlays_raw[WRISTS_LAYER] = result_layer if(update_icons) update_icon() @@ -1519,65 +1573,74 @@ There are several things that need to be remembered: //These functions check if an item should be drawn, or if its covered up by something else /mob/living/carbon/human/proc/check_draw_gloves() if (!gloves) - return 0 + return FALSE else if (gloves.flags_inv & ALWAYSDRAW) - return 1 + return TRUE else if (wear_suit && (wear_suit.flags_inv & HIDEGLOVES)) - return 0 + return FALSE else - return 1 + return TRUE /mob/living/carbon/human/proc/check_draw_ears() if (!l_ear && !r_ear) - return 0 + return FALSE else if ((l_ear && (l_ear.flags_inv & ALWAYSDRAW)) || (r_ear && (r_ear.flags_inv & ALWAYSDRAW))) - return 1 + return TRUE else if( (head && (head.flags_inv & (HIDEEARS))) || (wear_mask && (wear_mask.flags_inv & (HIDEEARS)))) - return 0 + return FALSE else - return 1 + return TRUE /mob/living/carbon/human/proc/check_draw_glasses() if (!glasses) - return 0 + return FALSE else if (glasses.flags_inv & ALWAYSDRAW) - return 1 + return TRUE else if( (head && (head.flags_inv & (HIDEEYES))) || (wear_mask && (wear_mask.flags_inv & (HIDEEYES)))) - return 0 + return FALSE else - return 1 + return TRUE /mob/living/carbon/human/proc/check_draw_mask() if (!wear_mask) - return 0 + return FALSE else if (wear_mask.flags_inv & ALWAYSDRAW) - return 1 + return TRUE else if( head && (head.flags_inv & HIDEEYES)) - return 0 + return FALSE else - return 1 + return TRUE /mob/living/carbon/human/proc/check_draw_shoes() if (!shoes) - return 0 + return FALSE else if (shoes.flags_inv & ALWAYSDRAW) - return 1 + return TRUE else if(wear_suit && (wear_suit.flags_inv & HIDESHOES)) - return 0 + return FALSE else - return 1 - + return TRUE /mob/living/carbon/human/proc/check_draw_underclothing() if (!w_uniform) - return 0 + return FALSE else if (w_uniform.flags_inv & ALWAYSDRAW) - return 1 + return TRUE else if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT)) - return 0 + return FALSE else - return 1 + return TRUE + +/mob/living/carbon/human/proc/check_draw_wrists() + if (!wrists) + return FALSE + else if (wrists.flags_inv & ALWAYSDRAW) + return TRUE + else if (wrists && (wrists.flags_inv & HIDEWRISTS)) + return FALSE + else + return TRUE //Human Overlays Indexes///////// #undef MUTATIONS_LAYER @@ -1605,6 +1668,7 @@ There are several things that need to be remembered: #undef LEGCUFF_LAYER #undef L_HAND_LAYER #undef R_HAND_LAYER +#undef WRISTS_LAYER #undef FIRE_LAYER #undef TOTAL_LAYERS diff --git a/code/modules/mob/living/silicon/robot/items/gripper.dm b/code/modules/mob/living/silicon/robot/items/gripper.dm index 6c539af7480..2ff973d22df 100644 --- a/code/modules/mob/living/silicon/robot/items/gripper.dm +++ b/code/modules/mob/living/silicon/robot/items/gripper.dm @@ -253,7 +253,7 @@ /obj/item/reagent_containers/pill, /obj/item/reagent_containers/spray, /obj/item/storage/pill_bottle, - /obj/item/hand_labeler, + /obj/item/device/hand_labeler, /obj/item/paper, /obj/item/stack/material/phoron, /obj/item/reagent_containers/blood, diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index dae42d169b1..3b5f6fb3131 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -231,7 +231,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/pen/robopen(src) src.modules += new /obj/item/form_printer(src) src.modules += new /obj/item/gripper/paperwork(src) - src.modules += new /obj/item/hand_labeler(src) + src.modules += new /obj/item/device/hand_labeler(src) src.modules += new /obj/item/tape_roll(src) //allows it to place flyers src.modules += new /obj/item/device/nanoquikpay(src) src.emag = new /obj/item/reagent_containers/hypospray/cmo(src) @@ -615,7 +615,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/pen/robopen(src) src.modules += new /obj/item/form_printer(src) src.modules += new /obj/item/gripper/paperwork(src) - src.modules += new /obj/item/hand_labeler(src) + src.modules += new /obj/item/device/hand_labeler(src) src.modules += new /obj/item/tape_roll(src) //allows it to place flyers src.modules += new /obj/item/device/nanoquikpay(src) src.modules += new /obj/item/reagent_containers/glass/rag(src) // a rag for.. yeah.. the primary tool of bartender @@ -654,7 +654,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/pen/robopen(src) src.modules += new /obj/item/form_printer(src) src.modules += new /obj/item/gripper/paperwork(src) - src.modules += new /obj/item/hand_labeler(src) + src.modules += new /obj/item/device/hand_labeler(src) src.modules += new /obj/item/tape_roll(src) //allows it to place flyers src.modules += new /obj/item/device/nanoquikpay(src) src.modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. @@ -698,7 +698,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/pen/robopen(src) src.modules += new /obj/item/form_printer(src) src.modules += new /obj/item/gripper/paperwork(src) - src.modules += new /obj/item/hand_labeler(src) + src.modules += new /obj/item/device/hand_labeler(src) src.modules += new /obj/item/tape_roll(src) //allows it to place flyers src.modules += new /obj/item/device/nanoquikpay(src) src.modules += new /obj/item/device/gps/mining(src) // for locating itself in the deep space @@ -775,7 +775,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/pen/robopen(src) src.modules += new /obj/item/form_printer(src) src.modules += new /obj/item/gripper/paperwork(src) - src.modules += new /obj/item/hand_labeler(src) + src.modules += new /obj/item/device/hand_labeler(src) src.modules += new /obj/item/tape_roll(src) //allows it to place flyers src.modules += new /obj/item/device/nanoquikpay(src) src.modules += new /obj/item/taperoll/engineering(src) // To enable 'borgs to telegraph danger visually. diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 609463baaba..0e0ea9854f4 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -754,6 +754,8 @@ proc/is_blind(A) return slot_l_ear else if (H.shoes == src) return slot_shoes + else if (H.wrists == src) + return slot_wrists else return null//We failed to find the slot @@ -1187,6 +1189,5 @@ proc/is_blind(A) /mob/proc/remove_deaf() sdisabilities &= ~DEAF - /mob/proc/get_antag_datum(var/antag_role) - return \ No newline at end of file + return diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm index 24d59c3c726..65fe194ee40 100644 --- a/code/modules/mob/update_icons.dm +++ b/code/modules/mob/update_icons.dm @@ -64,5 +64,8 @@ /mob/proc/update_inv_r_ear() return +/mob/proc/update_inv_wrists() + return + /mob/proc/update_targeted() return diff --git a/code/modules/modular_computers/computers/subtypes/dev_pda.dm b/code/modules/modular_computers/computers/subtypes/dev_pda.dm index 12369654393..f27329bc358 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_pda.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_pda.dm @@ -3,7 +3,12 @@ lexical_name = "tablet" desc = "The latest in portable microcomputer solutions from Thinktronic Systems, LTD." icon = 'icons/obj/pda.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/device/lefthand_device.dmi', + slot_r_hand_str = 'icons/mob/items/device/righthand_device.dmi', + ) icon_state = "pda" + item_state = "electronic" icon_state_screensaver = "off" icon_state_unpowered = "pda" var/icon_add // this is the "bar" part in "pda-bar" @@ -25,4 +30,4 @@ icon = 'icons/obj/pda_slate.dmi' /obj/item/modular_computer/handheld/pda/smart - icon = 'icons/obj/pda_smart.dmi' \ No newline at end of file + icon = 'icons/obj/pda_smart.dmi' diff --git a/code/modules/modular_computers/computers/subtypes/dev_wristbound.dm b/code/modules/modular_computers/computers/subtypes/dev_wristbound.dm index f7c25243ea5..43ef8faa10a 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_wristbound.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_wristbound.dm @@ -9,7 +9,7 @@ icon_state_menu = "menu" icon_state_screensaver = "standby" hardware_flag = PROGRAM_WRISTBOUND - slot_flags = SLOT_GLOVES|SLOT_ID + slot_flags = SLOT_WRISTS|SLOT_ID can_reset = TRUE max_hardware_size = 1 menu_light_color = COLOR_GREEN @@ -46,10 +46,10 @@ return switch(over_object.name) - if(BP_R_HAND) + if("right hand") usr.u_equip(src) - usr.put_in_r_hand(src,FALSE) - if(BP_L_HAND) + usr.put_in_r_hand(src) + if("left hand") usr.u_equip(src) - usr.put_in_l_hand(src,FALSE) + usr.put_in_l_hand(src) add_fingerprint(usr) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 8a641191da8..7b5d8c9b6f4 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -1235,7 +1235,7 @@ Note that amputating the affected organ does in fact remove the infection from t "Your [name] becomes a mangled mess!", \ "You hear a sickening crack.") else - owner.visible_message("\The [owner]'s [name] melts away, turning into mangled mess!", \ + owner.visible_message("\The [owner]'s [name] melts away, turning into a mangled mess!", \ "Your [name] melts away!", \ "You hear a sickening sizzle.") disfigured = 1 diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index f1a408301da..fd2d75ee7d6 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -27,10 +27,10 @@ if(!M.restrained() && !M.stat) switch(over_object.name) - if(BP_R_HAND) + if("right hand") M.u_equip(src) M.put_in_r_hand(src) - if(BP_L_HAND) + if("left hand") M.u_equip(src) M.put_in_l_hand(src) diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index d16e5437954..e644b27b012 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -7,11 +7,11 @@ set src in view(1) if (!usr.IsAdvancedToolUser() || usr.incapacitated()) - to_chat(usr, "You lack the dexerity to do this!") + to_chat(usr, SPAN_NOTICE("You lack the dexerity to do this!")) return FALSE if (!name_unlabel) - to_chat(usr, "You look again, unable to find the label! Perhaps your eyes need checking?") + to_chat(usr, SPAN_NOTICE("You look again, unable to find the label! Perhaps your eyes need checking?")) src.verbs -= .proc/remove_label return FALSE @@ -21,28 +21,25 @@ name_unlabel = "" src.verbs -= .proc/remove_label - H.visible_message("\The [H] removes the label from \the [src].", - "You remove the label from \the [src].") + H.visible_message(SPAN_NOTICE("\The [H] removes the label from \the [src]."), + SPAN_NOTICE("You remove the label from \the [src].")) return TRUE -/obj/item/hand_labeler +/obj/item/device/hand_labeler name = "hand labeler" icon = 'icons/obj/bureaucracy.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_device.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_device.dmi', - ) icon_state = "labeler0" + item_state = "labeler0" var/label = null var/labels_left = 30 var/mode = 0 //off or on. matter = list(DEFAULT_WALL_MATERIAL = 120, MATERIAL_GLASS = 80) -/obj/item/hand_labeler/attack() +/obj/item/device/hand_labeler/attack() return -/obj/item/hand_labeler/afterattack(atom/A, mob/user as mob, proximity) +/obj/item/device/hand_labeler/afterattack(atom/A, mob/user as mob, proximity) if(!proximity) return if(!mode) //if it's off, give up. @@ -53,37 +50,37 @@ return if(!labels_left) - to_chat(user, "No labels left.") + to_chat(user, SPAN_NOTICE("No labels left.")) return if(!label || !length(label)) - to_chat(user, "No text set.") + to_chat(user, SPAN_NOTICE("No text set.")) return if(length(A.name) + length(label) > 64) - to_chat(user, "Label too big.") + to_chat(user, SPAN_NOTICE("Label too big.")) return if(ishuman(A)) - to_chat(user, "The label refuses to stick to [A.name].") + to_chat(user, SPAN_NOTICE("The label refuses to stick to [A.name].")) return if(issilicon(A)) - to_chat(user, "The label refuses to stick to [A.name].") + to_chat(user, SPAN_NOTICE("The label refuses to stick to [A.name].")) return if(isobserver(A)) - to_chat(user, "[src] passes through [A.name].") + to_chat(user, SPAN_NOTICE("[src] passes through [A.name].")) return if(istype(A, /obj/item/reagent_containers/glass)) - to_chat(user, "The label can't stick to the [A.name]. (Try using a pen!)") + to_chat(user, SPAN_NOTICE("The label can't stick to the [A.name]. (Try using a pen!)")) return if(istype(A, /obj/machinery/portable_atmospherics/hydroponics)) var/obj/machinery/portable_atmospherics/hydroponics/tray = A if(!tray.mechanical) - to_chat(user, "How are you going to label that?") + to_chat(user, SPAN_NOTICE("How are you going to label that?")) return tray.labelled = label spawn(1) tray.update_icon() user.visible_message("[user] labels [A] as [label].", \ - "You label [A] as [label].") + SPAN_NOTICE("You label [A] as [label].")) // Prevent label stacking from making name unrecoverable. if (!A.name_unlabel) @@ -92,17 +89,18 @@ A.name = "[A.name] ([label])" -/obj/item/hand_labeler/attack_self(mob/user as mob) +/obj/item/device/hand_labeler/attack_self(mob/user as mob) mode = !mode icon_state = "labeler[mode]" + item_state = icon_state if(mode) - to_chat(user, "You turn on \the [src].") + to_chat(user, SPAN_NOTICE("You turn on \the [src].")) //Now let them chose the text. var/str = sanitizeSafe(input(user,"Label text?","Set label",""), MAX_NAME_LEN) if(!str || !length(str)) - to_chat(user, "Invalid text.") + to_chat(user, SPAN_NOTICE("Invalid text.")) return label = str - to_chat(user, "You set the text to '[str]'.") + to_chat(user, SPAN_NOTICE("You set the text to '[str]'.")) else - to_chat(user, "You turn off \the [src].") + to_chat(user, SPAN_NOTICE("You turn off \the [src].")) diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index e7a3f33fd3a..9fc1b56dabc 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -103,10 +103,10 @@ var/global/photo_count = 0 playsound(loc, /decl/sound_category/rustle_sound, 50, 1, -5) if((!( M.restrained() ) && !( M.stat ) && M.back == src)) switch(over_object.name) - if(BP_R_HAND) + if("right hand") M.u_equip(src) M.put_in_r_hand(src) - if(BP_L_HAND) + if("left hand") M.u_equip(src) M.put_in_l_hand(src) add_fingerprint(usr) @@ -281,4 +281,3 @@ var/global/photo_count = 0 p.id = id return p - diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 70b218b6c4c..3bb61a4ec0d 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -21,12 +21,16 @@ /obj/machinery/power/smes name = "power storage unit" desc = "A high-capacity superconducting magnetic energy storage (SMES) unit." + desc_info = "It can be repaired with a welding tool." icon_state = "smes" density = 1 anchored = 1 use_power = 0 clicksound = /decl/sound_category/switch_sound + var/health = 500 + var/busted = FALSE // this it to prevent the damage text from playing repeatedly + var/capacity = 5e6 // maximum charge var/charge = 1e6 // actual charge var/max_coils = 0 @@ -116,6 +120,8 @@ /obj/machinery/power/smes/examine(mob/user) . = ..() + if(is_badly_damaged()) + to_chat(user, SPAN_DANGER("\The [src] is damaged to the point of non-function!")) if(open_hatch) to_chat(user, SPAN_SUBTLE("The maintenance hatch is open.")) if (max_coils > 1 && Adjacent(user)) @@ -124,6 +130,18 @@ coils += C to_chat(user, "The [max_coils] coil slots contain: [counting_english_list(coils)]") +/obj/machinery/power/smes/proc/can_function() + if(is_badly_damaged()) + return FALSE + if(stat & BROKEN) + return FALSE + return TRUE + +/obj/machinery/power/smes/proc/is_badly_damaged() + if(health < initial(health) / 5) + return TRUE + return FALSE + /obj/machinery/power/smes/add_avail(var/amount) if(..(amount)) powernet.smes_newavail += amount @@ -140,7 +158,7 @@ /obj/machinery/power/smes/update_icon() cut_overlays() - if(stat & BROKEN) + if(!can_function()) return if(inputting == 2) @@ -196,7 +214,8 @@ time = ((time_secs / 3600) > 1) ? ("[round(time_secs / 3600)] hours, [round((time_secs % 3600) / 60)] minutes") : ("[round(time_secs / 60)] minutes, [round(time_secs % 60)] seconds") /obj/machinery/power/smes/machinery_process() - if(stat & BROKEN) return + if(!can_function()) + return if(failure_timer) // Disabled by gridcheck. failure_timer-- return @@ -236,7 +255,7 @@ // called after all power processes are finished // restores charge level to smes if there was excess this ptick /obj/machinery/power/smes/proc/restore(var/percent_load) - if(stat & BROKEN) + if(!can_function()) return if(!outputting) @@ -310,6 +329,9 @@ /obj/machinery/power/smes/attackby(var/obj/item/W as obj, var/mob/user as mob) if(W.isscrewdriver()) if(!open_hatch) + if(is_badly_damaged()) + to_chat(user, SPAN_WARNING("\The [src]'s maintenance panel is broken open!")) + return open_hatch = 1 user.visible_message(\ "\The [user] opens the maintenance hatch of \the [src].",\ @@ -372,8 +394,12 @@ return 1 /obj/machinery/power/smes/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - - if(stat & BROKEN) + if(!can_function()) + if(!terminal) + to_chat(user, SPAN_WARNING("\The [src] is lacking a terminal!")) + return + if(is_badly_damaged()) + to_chat(user, SPAN_WARNING("\The [src] is too damaged to function!")) return // this is the data which will be sent to the ui diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 761e92b4c71..1aab5b11652 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -87,6 +87,29 @@ SSmachinery.queue_rcon_update() return ..() +/obj/machinery/power/smes/buildable/bullet_act(obj/item/projectile/P, def_zone) + . = ..() + visible_message(SPAN_WARNING("\The [src] is hit by \the [P]!")) + health_check(P.damage) + +/obj/machinery/power/smes/buildable/proc/health_check(var/health_reduction = 0) + health -= health_reduction + if(health < 0) + visible_message(SPAN_DANGER("\The [src] blows apart!")) + for(var/thing in component_parts) + var/obj/O = thing + if(prob(40)) + O.forceMove(loc) + O.throw_at_random(FALSE, 3, THROWNOBJ_KNOCKBACK_SPEED) + else + qdel(O) + explosion(loc, 1, 2, 4, 8) //copied from the catastrophic failure code + qdel(src) + else if(is_badly_damaged() && !busted) + busted = TRUE + open_hatch = TRUE + visible_message(SPAN_DANGER("\The [src]'s maintenance hatch [open_hatch ? "releases a torrent of sparks" : "blows open with a flurry of sparks"]!")) + // Proc: process() // Parameters: None // Description: Uses parent process, but if grounding wire is cut causes sparks to fly around. @@ -316,7 +339,23 @@ // - Hatch is open, so we can modify the SMES // - No action was taken in parent function (terminal de/construction atm). if (..()) - + if(W.iswelder()) + if(health == initial(health)) + to_chat(user, SPAN_WARNING("\The [src] is already repaired.")) + return + var/obj/item/weldingtool/WT = W + if(!WT.welding) + to_chat(user, SPAN_WARNING("\The [src] isn't lit.")) + return + if(WT.get_fuel() < 2) + to_chat(user, SPAN_WARNING("You don't have enough fuel to repair \the [src].")) + return + if(do_after(user, 5 SECONDS) && WT.remove_fuel(2, user)) + health = min(health + 100, initial(health)) + to_chat(user, SPAN_NOTICE("You repair \the [src], it is now [round((health / initial(health)) * 100)]% repaired.")) + if(health == initial(health)) + busted = FALSE + return // Multitool - change RCON tag if(W.ismultitool()) var/newtag = input(user, "Enter new RCON tag. Use \"NO_TAG\" to disable RCON or leave empty to cancel.", "SMES RCON system") as text diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 7ffa56d8eb5..3440a738620 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -959,3 +959,9 @@ else maptext_x = 22 maptext = "[ammo]" + +/obj/item/gun/get_print_info(var/no_clear = TRUE) + if(no_clear) + . = "" + . += "Burst: [burst]
" + . += "Reliability: [reliability]
" \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 4b3824e34f0..1d3b0c59a3e 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -170,3 +170,21 @@ if(!power_supply) return 0 return round(power_supply.charge / charge_cost) + +/obj/item/gun/energy/get_print_info() + . = "" + . += "Max Shots: [initial(max_shots)]
" + . += "Recharge Type: [initial(self_recharge) ? "self recharging" : "not self recharging"]
" + if(initial(self_recharge)) + . += "Recharge Time: [initial(recharge_time)]
" + . += "
Primary Projectile
" + var/obj/item/projectile/P = new projectile_type + . += P.get_print_info() + + if(secondary_projectile_type) + . += "
Secondary Projectile
" + var/obj/item/projectile/P_second = new secondary_projectile_type + . += P_second.get_print_info() + . += "
" + + . += ..(FALSE) \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/modular.dm b/code/modules/projectiles/guns/energy/modular.dm index 2de908788f6..f171b7c4232 100644 --- a/code/modules/projectiles/guns/energy/modular.dm +++ b/code/modules/projectiles/guns/energy/modular.dm @@ -325,3 +325,19 @@ to_chat(M, "You describe the gun as [input]. Say hello to your new friend.") described = 1 return 1 + +/obj/item/gun/energy/laser/prototype/get_print_info() + . = ..(FALSE) + + for(var/i in list(capacitor, focusing_lens, modulator) + gun_mods) + var/obj/item/laser_components/l_component = i + + . += "
Component Name: [initial(l_component.name)]

" + var/l_repair_name = initial(l_component.repair_item.name) ? initial(l_component.repair_item.name) : "nothing" + . += "Reliability: [initial(l_component.reliability)]
" + . += "Damage Modifier: [initial(l_component.damage)]
" + . += "Fire Delay Modifier: [initial(l_component.fire_delay)]
" + . += "Shots Modifier: [initial(l_component.fire_delay)]
" + . += "Burst Modifier: [initial(l_component.burst)]
" + . += "Accuracy Modifier: [initial(l_component.accuracy)]
" + . += "Repair Tool: [l_repair_name]
" \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 3c0796c652b..a4760cd80f2 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -268,3 +268,26 @@ if(chambered) bullets += 1 return bullets + +/obj/item/gun/projectile/get_print_info() + . = "" + if(load_method & (SINGLE_CASING|SPEEDLOADER)) + . += "Load Type: Single Casing or Speedloader
" + . += "Max Shots: [max_shells]
" + if(length(loaded)) + var/obj/item/ammo_casing/casing = loaded[1] + var/obj/item/projectile/P = new casing.projectile_type + . += "
Projectile
" + . += P.get_print_info() + else + . += "No ammunition loaded.
" + else + . += "Load Type: Magazine
" + if(ammo_magazine) + var/obj/item/ammo_casing/casing = new ammo_magazine.ammo_type + var/obj/item/projectile/P = new casing.projectile_type + . += "
Projectile
" + . += P.get_print_info() + else + . += "No magazine inserted.
" + . += ..(FALSE) \ No newline at end of file diff --git a/code/modules/projectiles/modular/laser_base.dm b/code/modules/projectiles/modular/laser_base.dm index 704f1f52ce6..abd81ca392f 100644 --- a/code/modules/projectiles/modular/laser_base.dm +++ b/code/modules/projectiles/modular/laser_base.dm @@ -251,3 +251,20 @@ capacitor = null qdel(src) return TRUE + +/obj/item/device/laser_assembly/get_print_info() + . = "" + for(var/i in list(capacitor, focusing_lens, modulator) + gun_mods) + var/obj/item/laser_components/l_component = i + if(!l_component) + continue + + . += "
Component Name: [initial(l_component.name)]

" + var/l_repair_name = initial(l_component.repair_item.name) ? initial(l_component.repair_item.name) : "nothing" + . += "Reliability: [initial(l_component.reliability)]
" + . += "Damage Modifier: [initial(l_component.damage)]
" + . += "Fire Delay Modifier: [initial(l_component.fire_delay)]
" + . += "Shots Modifier: [initial(l_component.fire_delay)]
" + . += "Burst Modifier: [initial(l_component.burst)]
" + . += "Accuracy Modifier: [initial(l_component.accuracy)]
" + . += "Repair Tool: [l_repair_name]
" \ No newline at end of file diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index d1d97c7ad0a..d2f28a1a60e 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -613,3 +613,14 @@ qdel(i) beam_segments = null QDEL_NULL(beam_index) + +/obj/item/projectile/get_print_info() + . = "
" + . += "Damage: [initial(damage)]
" + . += "Damage Type: [initial(damage_type)]
" + . += "Blocked by Armor Type: [initial(check_armor)]
" + . += "Stuns: [initial(stun) ? "true" : "false"]
" + if(initial(shrapnel_type)) + var/obj/shrapnel = new shrapnel_type + . += "Shrapnel Type: [shrapnel.name]
" + . += "Armor Penetration: [initial(armor_penetration)]%
" \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index 2df507a4f04..4a4b41fe14a 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -933,7 +933,7 @@ reagent_state = LIQUID color = "#333333" metabolism = 0.0016 * REM - overdose = 5 + overdose = 15 od_minimum_dose = 3 taste_description = "bitterness" goodmessage = list("You feel good.","You feel relaxed.","You feel alert and focused.") diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index aa7cc4c354d..17b73f64f30 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -3203,7 +3203,7 @@ name = "Transmutation: Gold" id = "transmutation_gold" result = null - required_reagents = list(/decl/reagent/aluminum = 5, MATERIAL_SILVER = 5) + required_reagents = list(/decl/reagent/aluminum = 5, /decl/reagent/silver = 5) catalysts = list(/decl/reagent/philosopher_stone = 1) result_amount = 1 @@ -3217,7 +3217,7 @@ name = "Transmutation: Diamond" id = "transmutation_diamond" result = null - required_reagents = list(/decl/reagent/carbon = 5, MATERIAL_GOLD = 5) + required_reagents = list(/decl/reagent/carbon = 5, /decl/reagent/gold = 5) catalysts = list(/decl/reagent/philosopher_stone = 1) result_amount = 1 diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 3ea253e5230..6f5950b0612 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -390,7 +390,7 @@ reagents.trans_to_mob(user, m_bitesize, CHEM_INGEST) bitecount++ - animate_shake() + shake_animation() playsound(loc, pick('sound/effects/creatures/nibble1.ogg','sound/effects/creatures/nibble2.ogg'), 30, 1) on_consume(user, user) //mob is both user and target for on_consume since it is feeding itself in this instance diff --git a/code/modules/research/weaponsanalyzer.dm b/code/modules/research/weaponsanalyzer.dm index ab6b5de8b31..1cd8060b67e 100644 --- a/code/modules/research/weaponsanalyzer.dm +++ b/code/modules/research/weaponsanalyzer.dm @@ -140,6 +140,9 @@ /obj/machinery/weapons_analyzer/vueui_data_change(list/data, mob/user, datum/vueui/ui) if(!data) . = data = list() + + data["has_inserted"] = item ? TRUE : FALSE + data["name"] = "" data["item"] = FALSE data["energy"] = FALSE @@ -177,7 +180,7 @@ if(istype(gun, /obj/item/gun/energy)) var/obj/item/gun/energy/E = gun - var/obj/item/projectile/P = E.projectile_type + var/obj/item/projectile/P = new E.projectile_type data["max_shots"] = initial(E.max_shots) data["recharge"] = initial(E.self_recharge) ? "self recharging" : "not self recharging" data["recharge_time"] = initial(E.recharge_time) @@ -185,7 +188,11 @@ data["damage_type"] = initial(P.damage_type) data["check_armor"] = initial(P.check_armor) data["stun"] = initial(P.stun) ? "stuns" : "does not stun" - data["shrapnel_type"] = initial(P.shrapnel_type) ? initial(P.shrapnel_type) : "none" + if(P.shrapnel_type) + var/obj/item/S = new P.shrapnel_type + data["shrapnel_type"] = S.name + else + data["shrapnel_type"] = "none" data["armor_penetration"] = initial(P.armor_penetration) if(istype(gun, /obj/item/gun/energy/laser/prototype)) @@ -212,14 +219,18 @@ else var/obj/item/gun/projectile/P_gun = gun - var/obj/item/ammo_casing/casing = P_gun.ammo_type - var/obj/item/projectile/P = casing.projectile_type + var/obj/item/ammo_casing/casing = new P_gun.ammo_type + var/obj/item/projectile/P = new casing.projectile_type data["max_shots"] = P_gun.max_shells data["damage"] = initial(P.damage) data["damage_type"] = initial(P.damage_type) data["check_armor"] = initial(P.check_armor) data["stun"] = initial(P.stun) ? "stuns" : "does not stun" - data["shrapnel_type"] = initial(P.shrapnel_type) ? initial(P.shrapnel_type) : "none" + if(P.shrapnel_type) + var/obj/item/S = new P.shrapnel_type + data["shrapnel_type"] = S.name + else + data["shrapnel_type"] = "none" data["burst"] = gun.burst data["reliability"] = gun.reliability @@ -252,9 +263,28 @@ if (!ui) ui = new(user, src, "wanalyzer-analyzer", width, height, capitalize(name)) - var/icon/Icon_used if(item) - Icon_used = new /icon(item.icon, item.icon_state) - ui.add_asset("icon", Icon_used) - ui.send_asset("icon") - ui.open() \ No newline at end of file + var/icon/Icon_used = new /icon(item.icon, item.icon_state) + ui.add_asset("icon", Icon_used) + ui.send_asset("icon") + ui.open() + +/obj/machinery/weapons_analyzer/Topic(href, href_list, datum/topic_state/state) + . = ..() + if(.) + return + + if(href_list["print"] && item) + do_print() + +/obj/machinery/weapons_analyzer/proc/do_print() + var/obj/item/paper/R = new /obj/item/paper(get_turf(src)) + R.color = "#fef8ff" + R.set_content_unsafe("Weapon Analysis ([item.name])", get_print_info(item)) + print(R, message = "\The [src] beeps, printing \the [R] after a moment.") + +/obj/machinery/weapons_analyzer/proc/get_print_info(var/obj/item/device) + var/dat = "Analysis performed at [worldtime2text()]
" + dat += "Analyzer Item: [device.name]

" + dat += device.get_print_info() + return dat \ No newline at end of file diff --git a/code/modules/research/xenoarchaeology/misc.dm b/code/modules/research/xenoarchaeology/misc.dm index e5f7ac85a4d..774f5f8378a 100644 --- a/code/modules/research/xenoarchaeology/misc.dm +++ b/code/modules/research/xenoarchaeology/misc.dm @@ -103,7 +103,7 @@ new /obj/item/device/measuring_tape(src) new /obj/item/pickaxe/hand(src) new /obj/item/storage/bag/fossils(src) - new /obj/item/hand_labeler(src) + new /obj/item/device/hand_labeler(src) return //---- Isolation room air alarms diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index cd38d0b98b6..399134520a5 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -76,7 +76,7 @@ return 0 /obj/vehicle/attackby(obj/item/W as obj, mob/user as mob) - if(istype(W, /obj/item/hand_labeler)) + if(istype(W, /obj/item/device/hand_labeler)) return if(W.isscrewdriver()) if(!locked) diff --git a/html/changelog.html b/html/changelog.html index 0562f3cd569..52398708f28 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -35,6 +35,70 @@ -->
+

03 February 2021

+

Alberyk updated:

+ + +

02 February 2021

+

Ferner updated:

+ +

PoZe updated:

+ +

Wowzewow (Wezzy) updated:

+ +

listerla updated:

+ + +

01 February 2021

+

Doxxmedearly updated:

+ +

Geeves updated:

+ +

Wowzewow (Wezzy) updated:

+ +

Wowzewow (Wezzy), chaoko99 updated:

+ + +

30 January 2021

+

Geeves updated:

+ +

Sparky_hotdog updated:

+ +

WickedCybs updated:

+ +

29 January 2021

Doxxmedearly updated: