From 145b627464b2b1aa9082dd84bf2baa9af5c756bf Mon Sep 17 00:00:00 2001 From: RavingManiac Date: Fri, 10 Jul 2015 19:12:43 +0800 Subject: [PATCH 01/28] Storage system altered to be storage space based --- code/game/objects/items.dm | 3 +- .../objects/items/weapons/storage/backpack.dm | 4 +- .../objects/items/weapons/storage/bags.dm | 14 +- .../objects/items/weapons/storage/belt.dm | 3 +- .../objects/items/weapons/storage/boxes.dm | 14 +- .../objects/items/weapons/storage/fancy.dm | 7 +- .../objects/items/weapons/storage/firstaid.dm | 2 - .../objects/items/weapons/storage/lockbox.dm | 1 - .../objects/items/weapons/storage/misc.dm | 1 - .../objects/items/weapons/storage/storage.dm | 151 ++++++++++++++++-- .../objects/items/weapons/storage/toolbox.dm | 2 +- .../items/weapons/storage/uplink_kits.dm | 1 - code/modules/mob/inventory.dm | 6 +- code/modules/power/lighting.dm | 2 +- .../research/xenoarchaeology/tools/tools.dm | 3 +- html/changelogs/RavingManiac-PR-10095.yml | 6 + icons/mob/screen1.dmi | Bin 168715 -> 169008 bytes 17 files changed, 165 insertions(+), 55 deletions(-) create mode 100644 html/changelogs/RavingManiac-PR-10095.yml diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index d39d0e187ee..fe2004e911d 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -9,6 +9,7 @@ var/burning = null var/hitsound = null var/w_class = 3.0 + var/storage_cost = null var/slot_flags = 0 //This is used to determine on which slots an item can fit. var/no_attack_log = 0 //If it's an item we don't want to log attack_logs with, set this to 1 pass_flags = PASSTABLE @@ -339,7 +340,7 @@ var/list/global/slot_flags_enumeration = list( var/allow = 0 if(H.back && istype(H.back, /obj/item/weapon/storage/backpack)) var/obj/item/weapon/storage/backpack/B = H.back - if(B.contents.len < B.storage_slots && w_class <= B.max_w_class) + if(B.can_be_inserted(src,1)) allow = 1 if(!allow) return 0 diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index e4df419e18e..c4b7133a22d 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -50,6 +50,7 @@ icon_state = "holdingpack" max_w_class = 4 max_storage_space = 56 + storage_cost = 29 New() ..() @@ -61,7 +62,7 @@ qdel(W) return ..() - + //Please don't clutter the parent storage item with stupid hacks. can_be_inserted(obj/item/W as obj, stop_messages = 0) if(istype(W, /obj/item/weapon/storage/backpack/holding)) @@ -74,7 +75,6 @@ icon_state = "giftbag0" item_state = "giftbag" w_class = 4.0 - storage_slots = 20 max_w_class = 3 max_storage_space = 400 // can store a ton of shit! item_state_slots = null diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 4c808ad2f5f..8be4acb12c9 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -34,7 +34,6 @@ w_class = 4 max_w_class = 2 - storage_slots = 21 can_hold = list() // any cant_hold = list(/obj/item/weapon/disk/nuclear) @@ -61,7 +60,6 @@ w_class = 4 max_w_class = 2 - storage_slots = 21 can_hold = list() // any cant_hold = list(/obj/item/weapon/disk/nuclear) @@ -76,8 +74,7 @@ icon_state = "satchel" slot_flags = SLOT_BELT | SLOT_POCKET w_class = 3 - storage_slots = 50 - max_storage_space = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class + max_storage_space = 200 max_w_class = 3 can_hold = list(/obj/item/weapon/ore) @@ -90,8 +87,7 @@ name = "plant bag" icon = 'icons/obj/hydroponics_machines.dmi' icon_state = "plantbag" - storage_slots = 50; //the number of plant pieces it can carry. - max_storage_space = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * plants.w_class + max_storage_space = 200 max_w_class = 3 w_class = 2 can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown) @@ -111,6 +107,7 @@ var/capacity = 300; //the number of sheets it can carry. w_class = 3 + storage_slots = 7 allow_quick_empty = 1 // this function is superceded New() @@ -193,7 +190,7 @@ var/col_count = min(7,storage_slots) -1 if (adjusted_contents > 7) row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width. - src.standard_orient_objs(row_num, col_count, numbered_contents) + src.slot_orient_objs(row_num, col_count, numbered_contents) return @@ -248,8 +245,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "cashbag" desc = "A bag for carrying lots of cash. It's got a big dollar sign printed on the front." - storage_slots = 50; //the number of cash pieces it can carry. - max_storage_space = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * cash.w_class + max_storage_space = 200 max_w_class = 3 w_class = 2 can_hold = list(/obj/item/weapon/coin,/obj/item/weapon/spacecash) diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 7080cd19319..4d5b5e2e463 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -4,6 +4,8 @@ icon = 'icons/obj/clothing/belts.dmi' icon_state = "utilitybelt" item_state = "utility" + storage_slots = 7 + max_w_class = 3 slot_flags = SLOT_BELT attack_verb = list("whipped", "lashed", "disciplined") @@ -100,7 +102,6 @@ desc = "Can hold security gear like handcuffs and flashes." icon_state = "securitybelt" item_state = "security" - storage_slots = 7 max_w_class = 3 max_storage_space = 28 can_hold = list( diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 95c41916222..7a176d82e58 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -437,7 +437,6 @@ desc = "Drymate brand monkey cubes. Just add water!" icon = 'icons/obj/food.dmi' icon_state = "monkeycubebox" - storage_slots = 7 can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/monkeycube) New() ..() @@ -551,11 +550,10 @@ desc = "Eight wrappers of fun! Ages 8 and up. Not suitable for children." icon = 'icons/obj/toy.dmi' icon_state = "spbox" - storage_slots = 8 can_hold = list(/obj/item/toy/snappop) New() ..() - for(var/i=1; i <= storage_slots; i++) + for(var/i=1; i <= 8; i++) new /obj/item/toy/snappop(src) /obj/item/weapon/storage/box/matches @@ -564,14 +562,13 @@ icon = 'icons/obj/cigarettes.dmi' icon_state = "matchbox" item_state = "zippo" - storage_slots = 10 w_class = 1 slot_flags = SLOT_BELT can_hold = list(/obj/item/weapon/flame/match) New() ..() - for(var/i=1; i <= storage_slots; i++) + for(var/i=1; i <= 10; i++) new /obj/item/weapon/flame/match(src) attackby(obj/item/weapon/flame/match/W as obj, mob/user as mob) @@ -589,7 +586,7 @@ icon_state = "syringe" New() ..() - for (var/i; i < storage_slots; i++) + for (var/i; i < 7; i++) new /obj/item/weapon/reagent_containers/hypospray/autoinjector(src) /obj/item/weapon/storage/box/lights @@ -598,9 +595,7 @@ icon_state = "light" desc = "This box is shaped on the inside so that only light tubes and bulbs fit." item_state = "syringe_kit" - storage_slots=21 can_hold = list(/obj/item/weapon/light/tube, /obj/item/weapon/light/bulb) - max_storage_space = 42 //holds 21 items of w_class 2 use_to_pickup = 1 // for picking up broken bulbs, not that most people will try /obj/item/weapon/storage/box/lights/bulbs/New() @@ -634,8 +629,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "portafreezer" item_state = "medicalpack" - storage_slots=7 max_w_class = 3 can_hold = list(/obj/item/organ, /obj/item/weapon/reagent_containers/food, /obj/item/weapon/reagent_containers/glass) max_storage_space = 21 - use_to_pickup = 1 // for picking up broken bulbs, not that most people will try + use_to_pickup = 1 // for picking up broken bulbs, not that most people will try diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 081d1f7ba65..e352dd2c958 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -46,7 +46,6 @@ icon_state = "eggbox" icon_type = "egg" name = "egg box" - storage_slots = 12 can_hold = list( /obj/item/weapon/reagent_containers/food/snacks/egg, /obj/item/weapon/reagent_containers/food/snacks/boiledegg @@ -54,7 +53,7 @@ /obj/item/weapon/storage/fancy/egg_box/New() ..() - for(var/i=1; i <= storage_slots; i++) + for(var/i=1; i <= 12; i++) new /obj/item/weapon/reagent_containers/food/snacks/egg(src) return @@ -69,14 +68,13 @@ icon_state = "candlebox5" icon_type = "candle" item_state = "candlebox5" - storage_slots = 5 throwforce = 2 slot_flags = SLOT_BELT /obj/item/weapon/storage/fancy/candle_box/New() ..() - for(var/i=1; i <= storage_slots; i++) + for(var/i=1; i <= 5; i++) new /obj/item/weapon/flame/candle(src) return @@ -90,7 +88,6 @@ icon = 'icons/obj/crayons.dmi' icon_state = "crayonbox" w_class = 2.0 - storage_slots = 6 icon_type = "crayon" can_hold = list( /obj/item/weapon/pen/crayon diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index c23dfcdb516..e58b0ac0a85 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -131,7 +131,6 @@ /obj/item/weapon/storage/firstaid/surgery name = "surgery kit" desc = "Contains tools for surgery." - storage_slots = 10 /obj/item/weapon/storage/firstaid/surgery/New() ..() @@ -161,7 +160,6 @@ can_hold = list(/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/dice,/obj/item/weapon/paper) allow_quick_gather = 1 use_to_pickup = 1 - storage_slots = 14 use_sound = null /obj/item/weapon/storage/pill_bottle/antitox diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm index 297ac1d4b18..f88f731e36d 100644 --- a/code/game/objects/items/weapons/storage/lockbox.dm +++ b/code/game/objects/items/weapons/storage/lockbox.dm @@ -8,7 +8,6 @@ w_class = 4 max_w_class = 3 max_storage_space = 14 //The sum of the w_classes of all the items in this storage item. - storage_slots = 4 req_access = list(access_armory) var/locked = 1 var/broken = 0 diff --git a/code/game/objects/items/weapons/storage/misc.dm b/code/game/objects/items/weapons/storage/misc.dm index 6bd9495714f..755ba299e1b 100644 --- a/code/game/objects/items/weapons/storage/misc.dm +++ b/code/game/objects/items/weapons/storage/misc.dm @@ -15,7 +15,6 @@ icon = 'icons/obj/food.dmi' icon_state = "donutbox" name = "donut box" - storage_slots = 6 var/startswith = 6 can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/donut) foldable = /obj/item/stack/material/cardboard diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 70c1d33d732..0bec6598b08 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -12,10 +12,16 @@ var/list/can_hold = new/list() //List of objects which this item can store (if set, it can't store anything else) var/list/cant_hold = new/list() //List of objects which this item can't store (in effect only if can_hold isn't set) var/list/is_seeing = new/list() //List of mobs which are currently seeing the contents of this item's storage - var/max_w_class = 2 //Max size of objects that this object can store (in effect only if can_hold isn't set) + var/max_w_class = null //Max size of objects that this object can store (in effect only if can_hold isn't set) var/max_storage_space = 14 //The sum of the storage costs of all the items in this storage item. - var/storage_slots = 7 //The number of storage slots in this container. + var/storage_slots = null //The number of storage slots in this container. var/obj/screen/storage/boxes = null + var/obj/screen/storage/storage_start = null //storage UI + var/obj/screen/storage/storage_continue = null + var/obj/screen/storage/storage_end = null + var/obj/screen/storage/stored_start = null + var/obj/screen/storage/stored_continue = null + var/obj/screen/storage/stored_end = null var/obj/screen/close/closer = null var/use_to_pickup //Set this to make it possible to use this item in an inverse way, so you can have the item in your hand and click items on the floor to pick them up. var/display_contents_with_number //Set this to make the storage item group contents of the same type and display them as a number. @@ -27,6 +33,12 @@ /obj/item/weapon/storage/Destroy() close_all() qdel(boxes) + qdel(src.storage_start) + qdel(src.storage_continue) + qdel(src.storage_end) + qdel(src.stored_start) + qdel(src.stored_continue) + qdel(src.stored_end) qdel(closer) ..() @@ -90,11 +102,19 @@ if(user.s_active) user.s_active.hide_from(user) user.client.screen -= src.boxes + user.client.screen -= src.storage_start + user.client.screen -= src.storage_continue + user.client.screen -= src.storage_end user.client.screen -= src.closer user.client.screen -= src.contents - user.client.screen += src.boxes user.client.screen += src.closer user.client.screen += src.contents + if(storage_slots) + user.client.screen += src.boxes + else + user.client.screen += src.storage_start + user.client.screen += src.storage_continue + user.client.screen += src.storage_end user.s_active = src is_seeing |= user return @@ -104,6 +124,9 @@ if(!user.client) return user.client.screen -= src.boxes + user.client.screen -= src.storage_start + user.client.screen -= src.storage_continue + user.client.screen -= src.storage_end user.client.screen -= src.closer user.client.screen -= src.contents if(user.s_active == src) @@ -155,7 +178,7 @@ return //This proc draws out the inventory and places the items on it. It uses the standard position. -/obj/item/weapon/storage/proc/standard_orient_objs(var/rows, var/cols, var/list/obj/item/display_contents) +/obj/item/weapon/storage/proc/slot_orient_objs(var/rows, var/cols, var/list/obj/item/display_contents) var/cx = 4 var/cy = 2+rows src.boxes.screen_loc = "4:16,2:16 to [4+cols]:16,[2+rows]:16" @@ -181,6 +204,50 @@ src.closer.screen_loc = "[4+cols+1]:16,2:16" return +/obj/item/weapon/storage/proc/space_orient_objs(var/list/obj/item/display_contents) + + var/storage_cap_width = 2 //length of sprite for storage box start and end + var/stored_cap_width = 4 + var/storage_width = min(max_storage_space*8,284) + + storage_start.overlays.Cut() + + var/matrix/M = matrix() + M.Scale((storage_width-storage_cap_width*2+3)/32,1) + src.storage_continue.transform = M + + src.storage_start.screen_loc = "4:16,2:16" + src.storage_continue.screen_loc = "4:[storage_cap_width+(storage_width-storage_cap_width*2)/2+2],2:16" + src.storage_end.screen_loc = "4:[19+storage_width-storage_cap_width],2:16" + + var/startpoint = 0 + var/endpoint = 1 + + for(var/obj/item/O in contents) + startpoint = endpoint + 1 + endpoint += storage_width * O.get_storage_cost()/max_storage_space + + var/matrix/M_start = matrix() + var/matrix/M_continue = matrix() + var/matrix/M_end = matrix() + M_start.Translate(startpoint,0) + M_continue.Scale((endpoint-startpoint-stored_cap_width*2)/32,1) + M_continue.Translate(startpoint+stored_cap_width+(endpoint-startpoint-stored_cap_width*2)/2 - 16,0) + M_end.Translate(endpoint-stored_cap_width,0) + src.stored_start.transform = M_start + src.stored_continue.transform = M_continue + src.stored_end.transform = M_end + storage_start.overlays += src.stored_start + storage_start.overlays += src.stored_continue + storage_start.overlays += src.stored_end + + O.screen_loc = "4:[round((startpoint+endpoint)/2)+2],2:16" + O.maptext = "" + O.layer = 20 + + src.closer.screen_loc = "4:[storage_width+19],2:16" + return + /datum/numbered_display var/obj/item/sample_object var/number @@ -212,12 +279,14 @@ adjusted_contents++ numbered_contents.Add( new/datum/numbered_display(I) ) - //var/mob/living/carbon/human/H = user - var/row_num = 0 - var/col_count = min(7,storage_slots) -1 - if (adjusted_contents > 7) - row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width. - src.standard_orient_objs(row_num, col_count, numbered_contents) + if(storage_slots == null) + src.space_orient_objs(numbered_contents) + else + var/row_num = 0 + var/col_count = min(7,storage_slots) -1 + if (adjusted_contents > 7) + row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width. + src.slot_orient_objs(row_num, col_count, numbered_contents) return //This proc return 1 if the item can be picked up and 0 if it can't. @@ -227,7 +296,7 @@ if(src.loc == W) return 0 //Means the item is already in the storage item - if(contents.len >= storage_slots) + if(storage_slots != null && contents.len >= storage_slots) if(!stop_messages) usr << "[src] is full, make some space." return 0 //Storage item is full @@ -244,9 +313,9 @@ usr << "[src] cannot hold [W]." return 0 - if (W.w_class > max_w_class) + if (max_w_class != null && W.w_class > max_w_class) if(!stop_messages) - usr << "[W] is too big for this [src]." + usr << "[W] is too long for this [src]." return 0 var/total_storage_space = W.get_storage_cost() @@ -255,7 +324,7 @@ if(total_storage_space > max_storage_space) if(!stop_messages) - usr << "[src] is full, make some space." + usr << "[src] is too full, make some space." return 0 if(W.w_class >= src.w_class && (istype(W, /obj/item/weapon/storage))) @@ -418,12 +487,48 @@ else verbs -= /obj/item/weapon/storage/verb/toggle_gathering_mode + spawn(5) + var/total_storage_space = 0 + for(var/obj/item/I in contents) + total_storage_space += I.get_storage_cost() + max_storage_space = max(total_storage_space,max_storage_space) //prevents spawned containers from being too small for their contents + src.boxes = new /obj/screen/storage( ) src.boxes.name = "storage" src.boxes.master = src src.boxes.icon_state = "block" src.boxes.screen_loc = "7,7 to 10,8" src.boxes.layer = 19 + + src.storage_start = new /obj/screen/storage( ) + src.storage_start.name = "storage" + src.storage_start.master = src + src.storage_start.icon_state = "storage_start" + src.storage_start.screen_loc = "7,7 to 10,8" + src.storage_start.layer = 19 + src.storage_continue = new /obj/screen/storage( ) + src.storage_continue.name = "storage" + src.storage_continue.master = src + src.storage_continue.icon_state = "storage_continue" + src.storage_continue.screen_loc = "7,7 to 10,8" + src.storage_continue.layer = 19 + src.storage_end = new /obj/screen/storage( ) + src.storage_end.name = "storage" + src.storage_end.master = src + src.storage_end.icon_state = "storage_end" + src.storage_end.screen_loc = "7,7 to 10,8" + src.storage_end.layer = 19 + + src.stored_start = new /obj //we just need these to hold the icon + src.stored_start.icon_state = "stored_start" + src.stored_start.layer = 19 + src.stored_continue = new /obj + src.stored_continue.icon_state = "stored_continue" + src.stored_continue.layer = 19 + src.stored_end = new /obj + src.stored_end.icon_state = "stored_end" + src.stored_end.layer = 19 + src.closer = new /obj/screen/close( ) src.closer.master = src src.closer.icon_state = "x" @@ -481,4 +586,20 @@ return depth /obj/item/proc/get_storage_cost() - return 2**(w_class-1) //1,2,4,8,16,... + if (storage_cost) + return storage_cost + else + if(w_class == 1) + return 1 + if(w_class == 2) + return 2 + if(w_class == 3) + return 4 + if(w_class == 4) + return 8 + if(w_class == 5) + return 16 + else + return 1000 + + //return 2**(w_class-1) //1,2,4,8,16,... diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index 11c2d6a8539..4bf67deaa0e 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -11,7 +11,7 @@ throw_range = 7 w_class = 4 max_w_class = 3 - max_storage_space = 14 //can hold 7 w_class-2 items or up to 3 w_class-3 items (with 1 w_class-2 item as change). + max_storage_space = 14 //enough to hold all starting contents origin_tech = list(TECH_COMBAT = 1) attack_verb = list("robusted") diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 6b3fdd04ae5..c24126a0db2 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -127,7 +127,6 @@ /obj/item/weapon/storage/box/syndie_kit/chameleon name = "chameleon kit" desc = "Comes with all the clothes you need to impersonate most people. Acting lessons sold seperately." - storage_slots = 10 /obj/item/weapon/storage/box/syndie_kit/chameleon/New() ..() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 1115826be80..dcdf91f4c38 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -77,13 +77,13 @@ var/list/slot_equipment_priority = list( \ // Try put it in their backpack if(istype(src.back,/obj/item/weapon/storage)) var/obj/item/weapon/storage/backpack = src.back - if(backpack.contents.len < backpack.storage_slots) - newitem.loc = src.back + if(backpack.can_be_inserted(newitem, 1)) + newitem.loc = backpack return 1 // Try to place it in any item that can store stuff, on the mob. for(var/obj/item/weapon/storage/S in src.contents) - if (S.contents.len < S.storage_slots) + if(S.can_be_inserted(newitem, 1)) newitem.loc = S return 1 return 0 diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 37133f7ff3d..4ef2ab4f49c 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -598,7 +598,7 @@ icon = 'icons/obj/lighting.dmi' force = 2 throwforce = 5 - w_class = 2 + w_class = 1 var/status = 0 // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN var/base_state var/switchcount = 0 // number of times switched diff --git a/code/modules/research/xenoarchaeology/tools/tools.dm b/code/modules/research/xenoarchaeology/tools/tools.dm index e16db119c55..6d281eeedb7 100644 --- a/code/modules/research/xenoarchaeology/tools/tools.dm +++ b/code/modules/research/xenoarchaeology/tools/tools.dm @@ -30,7 +30,6 @@ icon_state = "satchel" slot_flags = SLOT_BELT | SLOT_POCKET w_class = 3 - storage_slots = 50 - max_storage_space = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class + max_storage_space = 200 max_w_class = 3 can_hold = list(/obj/item/weapon/fossil) diff --git a/html/changelogs/RavingManiac-PR-10095.yml b/html/changelogs/RavingManiac-PR-10095.yml new file mode 100644 index 00000000000..05c9267af93 --- /dev/null +++ b/html/changelogs/RavingManiac-PR-10095.yml @@ -0,0 +1,6 @@ +author: RavingManiac + +delete-after: True + +changes: + - rscadd: "Storage in backpacks, boxes and other containers is now capacity-based. Some containers like belts remain slot-based." diff --git a/icons/mob/screen1.dmi b/icons/mob/screen1.dmi index 8181013f7ee1be7be12bec1c7496197e1c2a0c74..960bcfc32b2ecca9d5c5850d189136a6a6040a21 100644 GIT binary patch delta 13307 zcmY*<1ymc|);3by-Cav@cP~!y0>!ORDDFDA6?aN0#ibN?3+@iZtvD3-KuCVx_ujj{ z^=GYQCYf_G`#fjQmS^uTCFnI}=t+$5>d8!ufch$xn?bTAYmHOpI@a>X&pma!T5hQ) zN8UH# z1-OkA+&le>G;?O3w6aL>Q1;{93@ufqm zgB`3x9o$15!b2p;UmeDVPrfoAnp7T9DFO2BqUsaa6iQ9KF>`j|HQFTsEOK(rpUR7W zBF^s~)@%f!P$cEnrhIR9I~FtW`jLM@JmQ!(x){v&xU$=(xRzuP!8;YgnIo2v@qi6c zOU=VgGyK4gFkls&va4jYinQ>G9_**fkl2-aM_zmjt0zRY7o685FLlLdq0tI_T?;7B z`V)Jr3YBVG@)bJ=#RTdhHDqpdf|f`EXUdv3JQu#SD$NS3M{x`o?8$c8UC9jD%95)o ze(2jGMnUd0UM;X#6V2=_PZA12jOw+w34Y}rhVR}sthTvdDcH|ILk$3h7>(>{9yG`ocLg%a$B5W&eq^`X>Xc zW_X+F-|!5bMF$BB^Cr9C_sYem7{a2kMjOraj7c8hBqg~<-3BGM=^JVc?(cNM4|6|d zCJ`k@Z>ZDt7p7O%3LB*FStZ_{XgyNZDjwmL$hlMIh#CnPu30xtLuruB$27Sm?o%9cJlA%T)NGtA_ zgVIA9*Dj2l7#EQ`I5=83WqBE0pKm9*{@)0HXNP@6jQWTO-~15~f!iFg(AK@*fa%_f zK5@_W*=uU{AlVVi;11BmZ!nq`nhJc~9b}YLDAae4VeT5q!QH~Q+7>Xa${GmI`spjM zYrjpb9_k^FtLqX>mJ~;U8p}S%H!eA6^!sV(=(y_ao&qS?zh6}Pk4zqsY3lah^ThT7uFoX1o<4ZGkdsOa%)^&`MRDuAI|MR9&2;0 zBlc#&?Qkzj({^t>)1$f_XKxf-Is5C!iFu^~i-fQxt>t=|wIJx-gM)Htx>1SdQHtvd zlkQulg0k>JwlE7H+jBu3NGmM~R8v0wjeP6mrbU#+-o>Js_LkOx zk&g>0w{p%w?7zwA3~MZR!v4Ji&N|GK4t$QKgQ#X!MN`lj@-PU(N-(b%X>yWzVN7xd z)ty2%;e^q$;9|2FFvT14ks*25tBf<6QIN-{Ueu9M8Y7tQTZR}jZ#5M|*nEyu^!>;9 zU|B5{=zI?7yO9okf?g0`qd9RN0M)L$gx`Lyi~p3Kq-$Ll>My()Kj!_`F#+2vQd^W; zA939F2FG(jl6W&dNq%fTi2uD1Utk@VBj~RNKo+cbK9$(K{2AX$VGI%oxQewf1%X$o zew1M%>k&hpL%H67&~`^*&4KYASY@xQ6qGoxGZ|~|zT0;rZ3fH^0VW5wsaAOXjaK<#m2?*ZG zRR=&GtKtJrOG)}+=nRbQ_$lSYsTv+M2rX~1*Br|q!3 z%MTq>Eig|g>Fnm_M((0v^3#vyDp3YVQC8l)vNT^r-kFi z^oRvXoNj+;16B~t3G!4GxjLRKdLQ`eq2)=8=-W7Nqa-6m?ue4;rKOG-(#%d;{%{Ql zP^v-}9!UnJ9x?VGKP3t!EVkxoNq-P>-mT0ganU-_%D!v%ydHcY%}!E>htChz%|t|> z7x0med_=~P?=jg4;aF2@ z{nG)7Mp-Y0+rr<=S_)f^ZUR2ItL2b`f$Dkz32Gc0X7KIx=Cv!Id&yH-xq_}4k`p98 z@#@1R(B{;F!dO;uAB;fM*S{&67$pQv)|4#KxXYj5q(Ne&2^!((axaI$-q|6^%Y8uF zWt6L6c^nxuvrqGb4s6jpBRxEzrRHW5X13$*_T{O=x4Mt9Q=1de#>JNm32F1lkkW`j zRn(q`Px{kdQ28^yxD&iQ*3kh4o*#mC2Vek)6bZ+5K?OW%ut_^2Zg?OKihPIy67)i^ zRxJ0PfGgbmd;?DY$Ejv_15WfHF!{;UD+qU0!VClCFRmDrd&zUF#p&fWuNF7hs7= z)*@YRm1RaCi2@V^t#-WRvnn7#-kQVl0gnki2V6;Y;zpVUZQxiu_?W@TUd$-MqxP9C zJf#lG3VBUR(h8#9CKJFy5aHWUBI@ngREmS`yt=h?q#L-D%KD4bcaA2@5<3PLa$ zniLFT@x#Inm7C{zxn48cg5Y12lC8Z_$DxBnlA{&frr)DwN170SKOB5NueS>!J4QPfeDMH6w3y+Es7?fyi7hoglQiU$aso!B+^JpMw1 zYD|6zWl}rONMf>E}o(+bb z%GC`mY+~j4O|#516ETt)*U1JbKIpHLitfqDRiTHoV-WST!yr)sEkFD3xz~Zx0HP#{ z$qyvJvw_2z%+puPbO3~akJFRO(|@Vkm+~dJc-ycBs%ZNO4VDEko=h)JQri08|%AKBXHOm(LvPzQPR0 zJc+F6xZM#`Z^1*)et+gzFHL0cDOxxbhfv_E8lB@GK>hePrH3x8k6Bcq5Lc@|UX#X4 z<>XVaq;ps{RoS3aP+X?TQ~$ew=Z{i5gFbv$&1cFFlyOo67&J&%JBcQJ;k7zDcGXOy0=Af|4r-qmA53s z?=U^dghqhRDi#OLMTD_p9X~TJfDB-4xi0U&PVg92?1Gd}$IaFKD zJU9zGn5;b*1Whp$2RUc>08=F$X-R8DxDyX88Y-+bhA9bTBH56@5^~+b32$q9N1lq!@2$Vx+=h0RTOv`sU+Zg zF|=Ujn6f<@s*ujL31fQ{*}h!mC{`6&8y!Htt2wF`(sb+pC9iWr+7=(Cc#Nw%lgJ zpl8ZzNk=j7bqS&_h935OKw7f?j%i6ajA$$eZ1pp~06qP%keVJt#?qO4ZUr50<#>_l}I#BZlilh8hZaNKPBb_z&`l{~F)4|r_dAJo;A ze>$v9^ODe}@utMuDa3_(phug6m!Pu>a(!}uxQ=O(ED^3UexjuPDC63@hrfAE*X2{b zt}7M~E;wiKmpge!rdj9M1|WjXE(Z#!JR1VYJxj3ylh$PfVShxluH=sBD3Xil|0Ls#5lfZVz;u65oBqA{a~RVcXSC!xz1 zMeL93-(qW_?e_xL8t%kfUMbcA>{*?`k?flxmaMc90VrR{kW!~a_K9%o2NjKpMyAhE z$!XB^`dc>f1SGdBlp=#zYA%yC-^M*rDeo}k$69XzQq=J{xvs8r&(5v{eB0;xK@QxG z?a1nm(>rz)G_6;*v7x^9%L;?>8sUFR3OuhBWTWJzCd`kH$;t6_q7e#C#m92-tIE_` zR~0m>T{L6lb+M_?DS43OcW8tL$Ih}eh8=$v^jq&{*GdUUt2p zBS%z(izFYrPWtzawWP!uQJ343M@>)Ro2Dz3t<-r;9hXQxDIf~s{ev84s{u+oSO9*# z6ZN`nHA(`PQhgy@Or8%W!zZ-%t{P9e!i~N zXVn$e8+GHCth=-gW9(U*!C0DZU@m{2p)l#Fd$QEo43Pz6JY!R{phs&>U?Hw~f7evg zF0?}DmUQc(A`u^rjhCCNBe4$H4FyWB!!1+Db6qK4c3Zj=EM8>RDZ(gPg1f`O0xh{t z`q=UEZQqAaa=dr=LHN5xQLvqeBz0C-%rsrr1^Ry`4eL4J(LZDG7W%a5=ic*&-W zGquI3*J#b}3DdQdF}A3zp|Nph<0m)nBvhDold9~y6w$zzGtR3d8&-EEAgx@Gjm^=V z!1enSq%HgV2CByCxAFY%`2!tp%V;EFAX`m3OU=(5W?9y_TsE^@kZX%j-V<;Kk(f9FJE1OL75{#^VrK=eNY+$<|WXaP_Tr$*Q#)^d$U5ztv@XuEmyL({(U>`}7XWY1f zKP3tI>+BP|@FV@O_)TXDx3e}XBk;`{QpBZ@kIOQ^B%aQjM-57#aL&fA>mSo_E?%Mf zaf7q*3B1Uy^MF(pz}H3^z~S^ezXkw>XkG6 z`v+?QbJTlki8*Xx3RonE=uV-H;1txJ0?-#{?7{$+Ya*3*I()Ca8&JwTR0Gb&n_F(1 zuKVFq5G;@c3Vu{DlF^jL-xZXRE+p{C%0Mt!=5DQ|G(P8zn=c73zLkVzFPLdXILGb- zh!^9{Y^_(3%G_^@zQG1lwLkJe|*U4OxGd0N}I7KFc3M33-_T5l5^x^(x`kiv>BT8+SN#aCneo&GzVNxVA zjv(2n$@b-$-z$rk~&l$ZoKIclL!9Eg|U@)CD{tEi2cCkOcxj{`UO3RRkro_etnnrlGNc-{P z9MvBBb$g=_l!K77D-KI~r%~t-LBl?x=^II-=B&~NTJGpTr$C=`12inGX79BB5q7Nl z>DVHh&(9DPF=;^Wp;c!Dp_zdf`0S7VQldIunC7Gecg;AMXoWsbvLkTR2VkeJK~# zda0`2KaIkJh z<w@R`>w`n!}W#eU%9vkLu$bVyjdc2f6WbN!3P#B=zpV8q>d`$Ar}M)`;TZvpGN~ za5(#=&=!E|Z17m%4Yss*b1jba2k2k?z@TRv7BjxBP2b}F^{Hqhw>hzii>NhlRQlM5 zCg*+FwY6zbK@1Ws*XM-S|7+s0U7bbjyqfwD-eEG+ExP^BNWeJD>9xMKHB=GUB(wB)_Nh|_H3;sFb z@Z5b+6h&f8p5ZqfnU-~@GekQ&KIRoise1~(5!ov6@2G@@EQQ=*N}tn)_ri~w@XnIq ze~?L-d`F7;1~XFc&byap<7$?~UM|J_5vNl(Q$~+W9MI<@S>Gw{WJz*G`I-O&FA|8I zFWYMDFn_XDfGWQG{X47`8{o`46`0thMwKqcdTr_bnQ|(n1GIggLH_MlDvt@3pT$IvDirLsC<&))0f!VJBp9F&EsBBbySr04t$*_ zL&BcToi4N)13n7Cu4?NZoAVarJ6AMCkbp;)HI#%ALMMX`se`*@0IfL|V@}&$v)hbJ z&4zfx7j3Vjv>zRgk)n99PLyXI+^yK-FJ_6qIKWPr7d^U5(**4Ym##kkIO{1y6)P~m zE#)F__b))-ttMcMB?kTK^DAP_-pX2*8L6nsR6MM?b&Ky!K!;CG9unwAYd=^;xu8pX za6kHViYVROfKUmbK&^Pd0lVmjanO4mVCRq?fQ_C5K1SdeiRiBUVDIC5po3KZtyq~f z?j}uz@Hqs!0ucvh&VmD6%G_@9haizh-QUHOztf?($}^|1nQ$Vh9x=Bd>5A%-_1{g4c7qo05uwQ3Od|yVKycmwi0pA34_yzb%ru1uzq^0U%%zFu`R+F|)xg*3ffGG7bUHez!9INILMy!( zoaN35aYB(FC9v|iv5ehhPboBZ8$;3#Kq?~jv_zNYIqoM6x15g=NzjTD6pweVf8@Kt_P@~3;rqp6WktLHei%wB8l6OxJ01l44NfHfsn%Dqqv z2mE&TTzI&)t0R&9km-3u+(r|H-4VdFlgl*UYf%x6i9X#dCESwFOE+vQE1mnes?7(U zM1J8%8NEs&J8Q4(1SyY+6;fqM2zwKi`mz|C(r>;yeJS;k^vnsu6%hnIDnoE(XQQ9+2mUZ`yc0z}$b zYi0@XqYEg-VWQVZ4#rp}eT#0DN;{7!Ae^$CXHqxuiM51-D{v) z^H|jlda5UW@0ip72O6eSHeN|A^^i*?8-l734xi-Atg9{nr{yj0ghAM!_bx_hFB4B; zVc>ga>rt(|GPvAU?d{59#v-M_E--FZBry4^k2Om=*rZLIMjR2q1k+)N>dGe!@_@kFG%y8esBC~KDVUj427{!YcaA!d?wZ4C#nn)Z28w-+rs!2Tl;G#?VhI=RyVHTO6 zFy@opNN}YAk2jL{=axd&n>YJa!_P%}-M4S^Nvx=BA=+4F*+R)8@#)thKczWlA;kgv zW|q*v?koi1dz*8&@vHOo_SCOmc}lR7JnR((k%~%frBc#Nk(8SO#5Bg2@a(;(I=!D6 zUu*$y*-0ZPwvgARY{r_cq^3^^d7q?i@G(OwR3MVv*)AD>a|}-p zvb{T$f>)7@K%3*hw*gZ>ji@eK`Bj8SNm55g_|Lo^)R7`zItTV}&|yh-u`e0++uf-#7vYeHYaYtjQL|%kW)?`3p62e8NAxAkazU$?Y;wg+eMq*w{Pd(jYaTk~z{Doj3G(6eo>a4DI=WSOe#M+>1eF!dYbXXkRW^xVZ>14hrB1 z`U11whb01o+ZP880coMIil1GTC48tiEzYBU%zl`FDduJzWV{;l(Z1Bde;M+*|#cwyeSvnO3?riBrH>b-NC)Yny7Ru%!`a$n6 zNK$uvwil~G8)zcG7yD0c@f;Qt^FjMo@gUv5dDcL%L5+D&@64c{exS(Cl%eP?;?}-r z=|}Mltgn|AbYu<`6vcy$4qu$&@(ybjIJ^yzqa#wuGfn-oVF$uHiS zF3|z5*Qy7v(s3GWGm6APvo72h*!spnofYe^65j@)CFv3weSU?6mhNLp2WPE2gF~c@ zq?Zys=yo$!YpTVltE|$Nz#swpth6V!tYv1_+&RCf$u_^Z=qN=Tmozvyh#mX_`vR5v zhLv;(!awpVdTtQ2Q({EFq5V(En-Jj7Vpm%HX1`|0MBe^npYVnui@TpdhzeF7 zn5%q#uRD+ZX$K-0my||tG4<&Pb-QHSjg?DddwDpWt2utyq z?CR%i39QoI4){KMu{;Y>#4--W*o>wXPWmnw+ERH=>NWsPO&O2) z>;|l8DZMVY*$=aNJnXL?UHJxj9E2I>$2d;US*SqO(3_&Br(=zSv$T6@?VJVZ_j+Ea zBn2o=r5L}MnRgg8H26VFC;=6J^JHm2;yWMw!}~20YI4DZRh;vL#LLu2K9@2!*v4g0 z+!H4938$Y8g~~WRFCUBnjR6S4AWjhE-zy{>9I6eipA>yl)o-Bkvd3u3$kCDnW^HVd zU|F-(ZdL-*Z&Hz8CB+*0`gRC@t2+coIec^(t74|6mI@;e_VV$%k%v2jJ~+-uEqHZv z#3f9|ez+0YsJj$PW5wzTastjdOsN|$6vyG9Co^nS=$mY^R>l>?IIPN~b z=AKTZB=+6wP3A19C3J7<3cI=2pZ+DRse6>ACC%COV0o0TZ(7?s$WBSX+Q_4c{!Q>M ztp(4rr*|YWA02g257Rxu6r3fwOrlSBr6tWzBqE48(v_>p$Gg`<93=o1P<;PpJyb@g8Tp&cg!^Z5HI z_Q7WX`=-e4wp+2f1bQ~A@U`YWp-31k5|OO5OHtRodIY3VXr0-OBM4)f}X(Q{3rc{|kL1x-RjeEOa<^Q=A39m9t| zMsN_@XEMsOqoH5&@P{!s+`sFit^qN!uC`nqaF#b$cn!v*zu4g+4qn3OOUcIaA0dd@ z)6hQ=;bN7m3|~1AXptv2PV!OCD}kqF4JKIO06HV4#D(<2`ITum@&(aTabv!D7WwvE z`|8_3xXIK|{<~%#fu*;4o>RoLHN1TxtC9kR+;Dm?XuGNI z-!DtK!Zs9j6&KQSRDJfy(JgnHk}s_u`*Jwcqq*<}*k#o3@A^kSUl{YVgYnUbH^Pe6LIWYq<1DT$?jm zf18$oT~0VJ*16^N^@%^4;TuVOQLkkQ1pVlpzBjk}=5H!wiv>!(R60{+BN%!~?`aPb zm$BF?pY6m$oJbJqC}P?0(vdZjlK@TE5%gFqTpMBGC=t~3urF|UWV&d6{_UU6WA}@L z16n}Y8iYJ-Bihn0@r(J3{Ych=pQ(Y!MsZ8Rl{f`Ex*I-p8oErCFfuXffy>mXSR>WY zrCS}7*c55Dwzrd4A0}}kdaifQoqu%tv2C76Nw+#}I;Vzz!_%9~Tsq630@n0}l7%cq z<5(~N%Qe=tCt8RUhw$x^Ey0jPO$3EFxb-*lOB!Y#wj2PfOTXOQjf z9mpE=2?Wc7Kl@Hk-8iFe=HT4t=qolk-SautaY2Qs*pd4Gv;X9VL`lLgunwa1$KyVW z90f?mnKvNPoIta90q>+oo<_BlX1Fb2S0F%W65jmJ#(hgwduA1U*=vFW53FdAfKAL| z`NQcJoRkZ*_{jt-E~kGQTO%+m;NeYG(pj1po$@(Y*bzM)v%BVI5%=)0_?MWP{77Z+ zNg#b~g3$-aWo4C-=b(w8U0}1*eW~8N|C6hP5WvM6t5(;Nt@7Nu^uY}LSFmb|_loI- ziON^RUDtiBkcTIVr4Ch#>-&g5^`7s!p!eNWAOvgbe%oKVr+tj@n^{&`yo!ppopTV- z{+aWh6Mr#K`m40fZ|-BNJ+eacHh&yhE4Q4A-o>sa)^f+aQJXc7Ir{fi#u-8M(Ty{Y zC2VvV|9!Yru&&Xgk#q6uE=IU9lu2op({Qj9#4Zy0sLIZ0GtO@lY!fp_eaZ6^yS9_2?C|+Jth*v zBI)OYG=&c|zF1zMsV3_5GpJ-itUNdUE?N$|MJCZ&GJM&WTP85x`2Kgkqr)?nZ!+-Z zRg~}!IE>`vjctN*SnT*){i+ld3&p>%{DnbFBGFnVe+*LkZ zA;R{FTzYtN{yl73Hz|9^=3_#p$bFRi_R!tr=UuF)cXxNA>^~*+$KMK_QTUX_zNVe} z^QT&c%Ebp2G_)fVTTWx;K)^fF`9;vhB7Gce^rvI;Szb@8fRi#^_|WCLIoWD?r>gh# zEIzN0OzkTVZvbE*5?h~4bY?i zv1JCV0x6hDcha<01_!<86P93!oN&bBREm^@y_7!sm!bK<6d zWjkeX{Knp8iGJ$@{*EzM%;6hmK!0!mHC2yFoBym>ewN-3aq7JMKk#TfI}s%B-N-~4 z7)!$cKNOpqZp45y6jKQl{yjO{0J~+aTQZ$SYnvmtaJykbq#ZAmY@zqN(1)|S)=Ndw z9IrPXo}P0ehue9wPa;xlh|==OA{s}9>pa64ch)w4>V`Gt=#7|lqtx>&OK=nzR|L!w zpaQ2S2J@pu>0>@?COywKSSK!ebXegQKP2$b3Mn?ccfJ7+l*o^w!fO)I6Ukj$HiAeh zI2>(n^BCm)f040d9z8nGOw9Zrrq;o6lxK97xO7(rf5nO4sneVmOl7rQjMNBcSn%bI zpzO|tJqiEBs%mqh@1Qh)K#4JOQ&$&oGeoMESKOI?+t`8Jp(RN_a&9F9lOcaXNgWgd zQqg|XDVF~t94mNRH}BQge{W$RB)*QLp|5}a6nRO>MxhXv79BZr@X|xDa?BQ*@IkbF zE{BXdk>y~#j%e2BgnobZmitEwd6z%IV|Tm8U1>BWPMlp+R0cmEm^jRjRiWvi9B z5*3;@1bQzUH?7qrR|l5W)gez-y*?1yyFDR|#y>q*65afyQ5=mvQ2uICX? zm^8ugu8*%JF~p)%txa>SXcGg)=R8Tp0dZbF0%1Gh>-C)vgSzp%Cbcqb5fx8$*?|kG zEAq)XrVPsW%i@$!N=gk{;W*KO5S6;r*cV@ws{lVkX}g~8iRn&whRA!107C63O4I*D!+82agQ5HaFue%9e)dlJ~4_7C5=kJKEu1~*P3v?JHPSuC(m zwo0TU9qc2K-4(9{I zsR|D<_3-slX%LIQ|BRY2(IDz`u^B-`pa*9W$6N0=;_(wPmOIwrRI-x(s~eh@q-?ay z0g^8S884v!&n?Gy;b$(q%t;9(Vu~zGUI)>Zzbw>FlBOI=7YR9a)NQ37P9JHN#Ky$7 zDiU+WdhVq1xIso!B)~4KE7IPJrPX7c{5_9@3#AD$jnJIWXe5q*3 z==yq^VO@&>$UQs0?dNK?2Uh3IN|8g^uX6hB3Z{ak9fe?%1Z}g0shh{#%foEy zRi%mo`bIxbPXRi84hueX)K)Uu)~=?jf3w`s2<<-XAE!HrA=2;k94BaV@l)CW#Knj8 z{PoKwe-g(naPtsB!sxer0;893yo>w2^vY`;z>N3hbAzw{1KCl0xwnCj>Nxi_Yq6cHFcJ4vb6QRi{@<>et^h_}9GiTOAxff6=0 z&m)WGKjppJm+@Jx+729Ns+%YWOjLpSmIsb~#1;dB_selnU*UI= zzuk!cJEXoI;s7x*S?~DGEphhXyS#)2sRDlvP2k2P3EYog8@zT-w5@?7>Q{mno?np3 zZt3+yuV5qH$5~`W!VoY_UMi?tL zRi8R!G%2Wuv9Cly`%nD+$Dn7W(cv!~IR%B7icNSL`LAEUDor~@1Kns}C<1d-B>Ddk zDS0lsN;t?H%1)Yp!VvvM9Cr=wPET!VQn#bls@&T8oJ@VHQ`jP8D3Rrv3W%Zas@lfj4V~m>Ie@tZ2go7d{kl#@Vf5uOFrS&$B zWz0O4NtdWsD_xVYKr0oyoNWJ}On+u})@@#dWA6p%S(y**UL0`xL3e&c{qGEAPcjB3 zbcAC{9Jqj2Q<5OI*D;ZUW;+SYmmWAP+mPQ?b{$kiZDCFMhzBFUz~17JEu*S=b9t}O zTZFenLIH-_$xJ;odW;1sS07$1*n-5Cfj3GM`U*8mCbA-D%?2<~pdf`ni}L$JW$7F>e63=(9}fxyhi z^Stl9_v;_sYgKhuowd*DQ~T_y`U>p$a_kglWcE}RWJpA3Nn5u7kV#8mIe`*-E9v-&f-zbA~P# z;$2mD+Oib;O3QS=UAfa2((R}~(nVv_VS>$5zPQLTE7OM;Q@-AflHchHI0;-RROUu{ zv~~{NM{+3kawzt5C?K$cu>ECz{*Gd-01BD_3}Rrqc2fUx2R*I8eOr*4u_lvaV|Z%n z?VERpM@T|cw7-wf98nu_UeEk`JrS(@3ty0Q{drrW-W|2OmPMZFZOmKZYMp(tDLb#p zY2uCWqIVZ0ANjfB6+ipue`Xe&`RyAf6sFRJ@3gxq@xD&?4MJKy?DPItYPB6ft?gZ= zDjpVLKs8`!+x1}IK+U=QYMiH`t}66qW~GJVubG8l)i=L_Yiq_dL9N-@EbAK2VspW} z&pSAb1sck4`bJ*h;|8?-Q0!~AdO$>Z{Q!`b?wWQ_GT{zsnG?zfz>txu^4xIV38Vcdvy!%tDiGe;(sIS{fDK z!oWU31ZUosA}gV)CsT3Kzh(9rc#rUvzWrma${oJ#@UZ=;{4aEq+6D;bqWz-R+0q=_y5bbXDA;Q^@80jS6=0jMalmcW*tf!{j9 z;5y*;8&9>YEE>h%{F-LPe zD$UgrlQO1{p&u#QLZ68clA5?$v<7aNR~c>5Uf%uASd-%Alpo=Eu|1s&(RwueC8 zg7;>=@7QC3+uLtum)dy7p@4UV1GnLP(qh|YeOTX1y(+G%;g3h2%t<4S?8-#A@t~qm zTU{h11|(GlS%UzRC>4XN<`o4C!XY`L)ETp)L7l-tAVUAn41e0M9;P0~t-g45|Eh}B z>GIvke7%s%IqaIov-qJA*A>H{ePFq&%J_Y7&>HXek?ltrvGz^{T6M=LQDjvS$IQ%T45I7hYQ6 z#*?T1&LXiBl#1J$v=74E6+y6YOee%gu?=Q7D%|aL-9bjcq95SuD#9pnkV%4pi|ph5 zqS05L4U`hu9VeR?fDt4U&u1w^)3oEfSD|l)qSfZtRsI4?LYmWOwjGaGI2C>PLavLg z^@$wP=fp{IH1|_Z{C%O$C1^I@KP&Orf;wCE-I9{<{)$Qy208OR_3MFXzT_~KB!CB14ZFbM+ zUs8QFlhYR}sZvsyri|%+`}fEGfCVP@7J+hetDM2X1D&s9MMO4u9vxpM^4BT!qQ&jU zR>wj-qE`52$Ka#2s>Rgy%VpZtXP>xe|N~d)SP6>XYKM zikPoaV{WrQV0J&A%!1CujPcsJ734Tx;>Zjlc_eXsf_o5bI}+DQlt%KR;jYC#7YsF4 zAAO+sI%xqEWfSQ=SKG@D;n;Vp{m%!+o(u)RNLmC@TDtTPcx9XtF?cH{qY+*y0uY{E z3ZbYCSYCWxe@I+yC-x}0fav4cPv`P5(|`bmb)K~pT`X0_A8)wnlQC3@vE_rwHbZs4 zeu!b;{En(6dLl^BYT0uZ#EnQO+Uk3?t-Oxh7xe)%N|DSlpVuh^>~A#1QHv5Tz@zt4#rBtcYvgKx$tkd3cTSN-$GS@}F8#x^K?Lf>u! z6yPP~szDhQn;rx!%<}>gCU=Ku2k^~g6LrQgIc(u+%)i(5aauQNlK;Z$jvo^w$C;#( zlVib5+LxiIt`8s(O&0_*LnhU3Q*@Vg0xyAB;KL0v+TmY%hl`ewIFQ?+R^C~$;FsN) z9OUiL)L1YBQ<=(v2*SXDap&*ASAZAn8f0sZct}hsxub9>LZsQKOIJMHk4tmiZj)q7 zXWv^HNQL-7(7W!_adv=6qO`YIBd_CG2r*+oK{Sr2p}1S?NRt~&gI`0o(WnBFp2>XN zvpAP0ZBKp{fy^N9<`CLNSmD}@4!&zF(uPl|f98_$1Geo`TrdLeF?j-|fdnetqVV&p z8CaV*AG~7A9P?S@MKbki;@R&O=UcWX`?t@#t4Xc|wuk-*$2vxiv4I_SKB=zUEuW+h zU~DwPNXNOgEJKeY2(8pPhQ z8M26}1T7Whcycf>j0!enUlMRV+5n&}m>S(Za zYeCd8yCi)hM|pFCBSX4OfN^nyJbgDQ(f4cO*17|7yxEdWKJ3OT#aeLkMS^fR52Ruw zhholjrr9 zV&Wg1Zb5DHhxaWkt|4A8&vl775-gO}o05OKV6oU9DQuBgw}j2IKBp%olhb{1`Uh}q z>1kgec>onj5h#;7nPIU_1>LczvV#zRPfeqQ+2q8%pzj;|XV1(&a)(!imR5;|loHR} z+tYXEfes z3N?-`su0n(#t4I?bU8+=)o%S_C9@4G_>8;eR#7zHYpB8*Kidx z(duh|Av)!y@NUzS3x*P|8Uw+Lv2`nd9IjN{Uc=1-Nu)4rv@Uxw!nR>H3%tH_W&Y28 zy*%Kp7iQa3RKCi6qa%=Hn49u z2#SkzIc}5TFQ$Y`yj&jnct-tDeQN%zF?&+r#4Y(zr{IFj6bkVW(`yI zJr{B>Y&h9ML{4u-O->#8(!$g@u+4)T770z=c<^CjZvIB9f>r}|eP-(1n4B)LM$p`GTvV`pe%P~ZHnK4+*hMsxE#?O8R!1X(J1 zssbEUfV3U80GP>Hj6GZ8$%xT-m;~n!C-U2UOukPj-5cV`2eBM+ZnEj0tllXX?}0nr zxQxczG6tP!T2_S%L2E06Df{;Kz0`Fs>Ng)8Lla^vu=k2Yyz$bW0n(D$?gphZEOxuv zom)o|r`E7UUQWgiX~$B#5&|rDF=nSV;%xjtBIec|Ah!Q9Nn=#G;h}OWan=Anj{%vP z=P3yuOGvhcxjjYeD$F?KmX$onuiYQGEicJP=_MmvgS8r|v4h0Yl5(kOPi)7Y<>IwN zJ^n^oBuB6AtBKp&yVvA2msrAEq0^i!83eP0y2!J6kDS;L9+bV^g+ziAR*u@B-G5&M zRD2ZAhkjeU&)go3{t)Au05psk550TDNZk^nAwMOZehEYJ-{MN5X3(s@{YkZ9(o*TU?Dj$G^X0Gk4@%76Cd+!k;R6@P zgVFGol=s3rlP;l@iOG7pB~V>XHDM{W0gv{(%=8V%po}=Z#N@O)j1P}Edqn_H^!8^C z%EM{U>mNVLLF(^Bo?m+mL3yRrwkFF$DKnE#c$|5KBol_3_Ru&CkyDwW2c@-gy(bai z2M>uNSOUdYx+q-eCVm_U;e6X`?bkh60J~Xxd$;7Bw+R*@Jrh_vE^Si?!P-*SHDcWI z?Y2PFhXeP$3L(-PBiCGgCBS9mw}o9f`uPpV7D2`C+VG>YD+UwytV??8S!7$vO^ zN@S$icqI`vs4Pducjl*&nB2;l_GN>^If&VS=rUwz2BuQ++ythr1nl%#nvQ|b@b+hk z0q{j0D%Fb5fm1lq&T+FZ-B;gToJMkVK;^#fM)!eEHW zVTL;gf2J$VtIl3o7V3G?AW`=*Qo;h@N`)uTT8goyRxf7A9))B`qlAr+J=Y?u`y|C( z!M18u`2L=`5Ppph{K2OZZtnJmn*E(^r%0Qa{1TKAj=0a8fPDS+1G@MF%loE9fN;EX zJ@Ue#@361aLpmGmYKj*t$hHa;6!d*-1EYR9&)$(Ro?y?hsR`YEAM~BodB8UFu4W z4j@`ky&8-v4J3p(u?3|(p^%TvJvBs^#vAS8m5*CAWkb9iH| z!K9`u^M`-#wTh|q4W4V;H^o&B-4uhwn;T#80K<=|tI4QwYhl!P`nve=BpD==DC}s3 zNc&QtY8hRa2y!=9w|sDzc+o$BMSH5svu`-8)k^#D3YAkg-TM8&1w;VjQ9wnJaU;z0 zJo|!f><4@)OJE+swDEpouxJ43onpjFm;I^xrz-CQC6!{4Gwug2;h>SZEkVP>sl*h| zi`k1$ZGG>mW{PPT?Y2P9F?Z_Vpz(jZfq(jI!E+a%D*yY!*TH*8*kotV!(@SYl*$iw z%2$2wGF1o8s~WmbuQVzu&o0MNpUX-n$i;VhFBP{9D)|h&^k7R7EDUg@8Na4pDC|g- z21K)KLof%n-Svm2+_LU=kw*p**BdUH5`HI13wOIUAHG0E0^OHbBR@TPt9)!FG$V1_GjT-iMQecgq^APA~qFUoA zBSb4}TME~VQp<+jJ_Jd375#mx#M7#mv9Z4DqnK=0(F|UW)vdH%lw(O=H@VaVxMRHR z=&vsxzls!OrsB-s1P@GpeSLpGAPcChJ_`us2hL=?pl*V;ly)l#&j4>4qenS~-am`8 zgJUCIAMaQ`FYOd}>Ghsubia(vlg56dVCU8`n3&8em6w~Y=t5=q%T$7uhX17da_bE5 z{c7Nb@Nb`>{3xZw7`=RC>vE)=T0n&oC2s}y7;J}bw6v9L(E>emnYG-uN9wvR8$HS$ z2XGaHXnl>%k|w1GdDNd@uq^nw_fKuZqVb@FLeR<&whPX!fi4exV@w_PHmo7G66lfp z$PEUB>S#|loFU{~Qo^;ZtJp6zGxrX0QAA2{qL6VTVbZct+9zjjAsOLGBF2SlVX+h} zlnkU1I?qZT`F{u?W0?mzNeCHoYCi%siPf&Tm~n$~fj>OUn;mV+DjudN~D#{x5VZZno~I=#YOr(f-AS}fs7Nl0osN>Vf_g62W4 zG*`+x@=j?`z8jnL7+QShJ1X1il00mEPz3kG^PNNHfIe!}EhHjCF7_*7Pzca;4WbNv z;l}zKk!|7asek16*@e?zQS{V8q}G1F&D_@EgA^hR`GAH{P3gOwk`&JD*`_w|GxKx; z=`-0FaPIE=q?KT)8cNOF=g`htaWIf`8;fqGRE2VXxYZ+vqPTTEFEJr6$o!U0Ulghljdra5Y|t zg(x8ZrN-f}{i(F}=D^UK+}n-Vp_c-ze=7{rg0a1Kt0QbL!-o42AwaYeJGP;ZW(A}B zr*lZW^F!Nj1PO)tsL+hM?F0TpUI75F9FA&-f?UqQq3JWy2tw0~&}2tar&Z6IiP!sQ z-7*Sa+LrnRMC#C$w;t{o^uaU}CVBdIQ@Z}F2Bp~6ze8~6iT-_R{P&4{Hj&5~WAeAb zKskXk1~BRPl9c~2To%gA|B020D!}n2GZ&+onOQkR#ubzzg<%@hlI^oWAu(0RaD^`; zO8j|-g{gq0m}2+fPefSEsEopn4BG=7k0*G`ml>=4pO9eAJ%Lo!%N*;Z5*+=sK%N=tbpWUu!j z>*vy6=*u-KT9sY+(I?I?PH#?aA$2k~UO>W~r6_~7avtS*-h(#==YRc_Y-4PI+bDmi zlqTjiwHS4nLW>{L+HP*K4iPU3tLC}7*rjtBgBNGZXop&g4nc}~H!Y+e0;&_3&GE$ge<*%2y%)fc*|n2^7;8M z0hl1%2-nc%>$r_=;lu1vum=$7VDau(yhWPj;*@>V9JMGbYoqfcOzoWZd=o#u*Kesm z+Eh(N36!GoP*w4*R6;vI^6rVFvbo_lX#_L8?(f~)WRSv1$)^SZ?T~2BeC@T&^WASDwZXj7 z@F21jW#94rr1&(h9dcq^eN!P*8@e3l6Z=QChz5L(AHGc?EPciptZzF^!0EJu;=D`C z^{uqpHrN~s$8y!vD;iXApvuI;e;lyyp{;UAF#fUAqT>@R|tx>VZ zY~=7=-!+%Sy%!EK`Pfy9Ug#u$L?`0nkq zk?;Bn5`N}l-#5hsuOLs4_ERbcjKoV@Fe|r_X5o}QV5^87^=E{7&c$+I?NyL?5tq{X zSgUPIqb*3gMg+a|8waxW(VmLr)QSH0+VW;^0y(f%oaoUX>tC^7Orw_UVu!?xJ9f1zF>M}V?bD< z8%y1y5Xtq|L5B(l_~zXQ&fnWft{yP11FsDZ%ql48C&v;*O>7vWYHu7tekH>w`G}9= zcIzrbd8GII5N6Uw@Ufv(dj1RbhN4Mp&j8Z!RqU8t+0?pX-4a=Ad!60)jv3A=IcrlF zozn%oA_@ZGz;g@vQiJgRvCqQ`Q=*2rY5IH%%EC{Iizu$pKB{turMKrlm>l8j$WanK ziJgF$4aTKgLBCr_d!pgnA+PTULSpJ!rvZWx2vM<2L`g3ayD&*rEp=#x#Pb#mwe86= zg|drZm`umSlksB!v#wsqj7fURO$&vPG9B7w_B$Z4sYei-mC&+XY}FKy^4^MUF;-siTj4eCmvf@i3Vf zf~ijpjA30L<~{g>*@8al-CZMy25g01puZ+fK*J%|5`J!cucX`4kx8gm)!9o^ z=mM||St#`?YFrqOrnX~COo>f}ek6ih{vHrO){7ksWvsJ>p9GO|eke^QX7W&as>N)Y zmy>D8w4~F=fywEZkFa0g2bV05P`9DXYNFEk7N&=#JeWO%bHXa@Raw{fwUQl)Ldc*h z^z6q~Wka;5rOyp?+vkIYFMw7yy;Iza3>1Y-4GFZ|-);BVZ6nf(w51P9f6&t!?qiR| z7KeUE9k;Vqd2`*89T_rELl#-|9UJCsaxh@bMg=y&cyps^D{Dg*G{HGF zDhO2O+!632LM&~u^8b4IiCNvvtquRgOVMyreu-B06@rwOVS+aD9W{g59av&{ z?USh7)`Dj^pJQ+ci47*17KF)1X9Hr&e?IY4TwX?-t>*hp~6&Ri-+fn8G0|le-{)tVr2e<`9Y;8RnsD z&FbsRxwq!b-6tOxzzc(8isk{pWJDJs`w6l>DB(s2_L!R1H& zJPv1??~hMjW&Hl(Jj&|&Ca|3&nR#SxAzAIcG^u}lap9GmKs%4hv)CbEBR?`?F?gk* zVF-y|^77P~8H*Gz|7HE&VgU&Ir;j!C{W-ixZq)u>WoobeF{(f6^_D#!Ba@l8r5Ki& zyKTbcm{sBtii_&gJ+$oIqBT>6 zievvJHZs6a8XMxMLhYCqLHui)XDEO}#W5|zn{Fro-j*_o(2e>MYWy^2?CpHoomPvOJkoy6PY^NR=k9fHgJEAqvDmeog5Sb zFiL4xah&LK=$Z0*qDPV9)M<&)kK#e@lAwKn+iKA5A2^?U#KTO*FsKofTSZBZW8;F_ zq~Y%Yr#!m`#RDsotNl5_*8g~t3Zf9!DPR`l7Uey3CfhQ{y3;=V($|Hyocm#!H|1& zIL*y>XtXY*X4^<~jG$#kTZs-kp|zolTxZF+-Z-Y=|2l*6^dJVrxAi z_dMZ2{HU)JY4zvZx$Y^$geL0~GqYG_rnhe!k&y6f|2a#*XA}an|M~O>_}aW>$f)XRHo;3rp(Kc#Oizw#}WzvK(DsQ%t)yX>Mg)D6{~w86=r z2A!O$Vwe#i`K?Gg7FZzx#Cb$yNc_KvrT(ToEd6O+s~pBpepf&94^yQBLQR~~`9NcK8~ zg^~CVmZI^xXcXER7`Yn|E*O|D3|Xy0k}2WfEfcTx}=StVt6?NMGuT@OKbtX#KZO(KKAT$1VqA zc*h040DX=6E!MQ#*ZcQ2pwLRa7_r9_4QwA>{kMIytj)FFAttl+mAa?zo%;86D!mn8 z*Tbrgap~@J6M#spQ?PCa$yaCj-v(JiA~QM^%ty=Wd+Z{J9GqAF72fDNv^py~$`vJr z6;51vDAu@GFP~+hSpOT(=rrZnG5Dp#jhg@z)46~Jf3-8qj;AR5_eMp~)7q{mK^$ZB zVy@5KivwwXf|u-+@ULyF^`a}1Z-xHi?ArLWd&YWwQz(ZVmvBIdYhiQShuRILNC_|L zorjY&wM?c_m0Ki=gjH1PnmbF}FjtD6dOX8)oiYY$Vq)r-CW=0|pYf3$!o%HJS}_5_ zOxg6$EiHLTFTb#(?LMNq1l1(ys{Ws$CS-(kzj!<`cTg>70v5&N(KZV3{oK^_hF=qCOhq+Og*E5QqeU!`ds-2EO`-5;b;95 z9S&OoM@Pq0^$Wx!`p8S3;35tSiY}2e(69yFhv1H)5t1M%IM?#OQD{}4s*fCNbIffO zB(sXiSC~Em>BF^`I1f7|sC18Zq&AuK|A2!8j~3qU@L&ayaBe#LuGc!f(TZ#3@@L6N zfn!eMI(=wf7{i8NVOIKvD3EPdtaPm15p`Ny>V0)ZVwjFc_*L`ECk8>=uBh%*^W_dE zh50|&!(Btf$E|jG(uMQaKH(nOH~||AEq?_#+5Qj94;&2QSr*wP5vGvt9ca#dP)-lv zjIq8rrIJ{h480)ldJH#tI0!sm`uW!G@-|}Y^8U*F;Ve`FduJo+?vmo7`C8pW+3Jo3 z=flJF7Z0Z0wk`Rv2$YK@xV%SUz7#{6(wA5L!vWJCv-FvoI187uyBbyRk7C8E`PmtC zot)Zt&cIFHOPvNnn|NTjV|w6XSAi3XI^=a5xAYV(q(V-%UBUOC6g=L zz7W&e<*KVvE#^O~(8tIgCHPa|hCc-^6ca~<64aJKK=%YKlXCLsHhEs|w%}z-v09l> zf7&KgN@H+FmSL0s&hmAQXV>5J^@+%E>rE!}lN4ABO^gDBLZnXY?Gb64rww{bP zGY2EzZfVfLa8;-%@OO&Y%9ip`+MCRFnKJjCjqL=YXAIU5JiC8h70mWGz%J`|5zoFg z<*lLQTt8`w!}&QyGm+@0!853TiuKV@#eIZ^=Vb4-sR5H$&oOWFB~l!#+MFV3tUSI5 zKqnm6c}l%{x(*X-?Ex3*_415hDTsyP*^%znPXk77qkPDFB*`Zt`YcUGsVe$es!Qt7m{E-TiIX~MAWtU}64v=R zFOvjvH@d${L!bO9gdQ6l^x<>tdc~|km`UV#chOxtN*I!_$-rx&ZrJR)miX)ITBToq zkvNiAfgXDDcjs@$c|X>&fBP{T)>+mDM2R1qV9(O{ZhG4JPHK+!U3}n43DhhKbhR7w zHG5n{F~yf`S6f<~uixyLC7Gx|Cr#s7I;rv#;V$TxlA5C$;dq*l*=x51Hrede|Kz@nh-D;T+l2ZD8sKkRq zUX$N;J#m#(G_V>-37@!waXs&%3ct+qiojWGc4rX%!Dw_3Y^tf0TA=)B1Q_Mt!<Y~~ zn94;`)mN^kyMQ52a?;MDj5xyg1FJV?HUw zNH)F~#$mNf^5wJFFgy2Gp#9aDJGqZ~F%tHeKZ|c59z)n5;6s(Pz3CiJ&&(`=qeqmo;JiYn%pl^p~3JcyqN~EyQf8Kk4(w8G!jP z=qc;I!L}ajF0Te56_~y9zG5%ORtY3(wv-ZH&C9rzck4Uy3ps&0 zMYZOe=IYQj%DI@y4V+7VCxYY>$0s{E)1v^`iHw9!pLKmcr~WD1P9bv=U}tFGsp)7> zMOQwQVmO3+scYJYdRTT?RM7vIk6=aRe~_8UNY37R60458S3RaD7XQkat3B;50XdLW zeop~jqtyh0vk!S@e3Of{IVdRo$33d6u*;nx>x zowCTPol)`H8`}MR`4jF!aaj+P?ANAD&Zn$Sj@_9|1eh_qHUWZqQg!2>s~J>XNP;XC zd;XzfA0uU>DpAsYL72owSpxr^vPhCad>vPicOqSd`gbO44Db8hmOn>I~Kl73x`7)TFYixv3yjdB*wO3QALScB4JSdSCFl#AKlA}9O7V`}$ zn}DpNRNi)w3ac~$6F;4hK0}nC$c(|#cUj@9GjVZuo<4N(JS3~dJ&YT1f{Pi zt^dh)u+$;IxvxT3!RdN=`Au(a!1E^&jnqDr^nQ61^?x{?FH$fFg!v4+$|;Y4pM$Yd z!o6UFZk@#KA39SQ?1f9DxX%rQFIpSO#6`BD%*aNH6Z#dlK6S1i&<|`eVLKSI++X|p zd6X$LmNC=!h`MkZCXS4%DjQ{dI$9Ka73+0TIT*-IXvNC)GjVc>dbi`pb@O|=~D$zaiHCW{#K}QWjsp; zO<&S2F6271;xyo%jO`OEqq=1}sZ&+@qx7nl@s==fd{hF_(^^&%Ce>@mpk@|DB z$%fzJpY9}Bl`ewoiXIb^L7p9)he@p;fYSmeC(~^rWiyu6d|_&`Sa?Nxmr9qRr3TE# zMgEn|G;^j5kO4la?sL)CHNX%u#5d3!0Jo4wYsya3&b{uamvD(7#Zp98oxyysTe$HG zt%WJB{9Q%WdB>Dstj=7Rv)^{s39YjT1Y@htswr$19X~IEIjkfOYD?wZ7*Q?@C`@B= zeP;h4UiNgt_}|1|?=H#s&7=uEv|8%X1g~GqMD9=4z_`9>ti2NtnznQYCr515gazbv zntwZnvj_Z5HnE#>_-V?E;LYcEbw9V8pj0Eoi!PteHB)8g`|&KY1Z`E%xvC;cSnDFW z!!*f*^@^RgY0V;s2MMglSso4CxOZPOO_#rm{b4N?Zvao`+#kyoSj_%6d4N>=@d$C) zSbvY@l8BJ**O-)k=>p|fi~Cqo{ab4Bioy`*QE~o6Zd5@?PnW8qmO`zZ<;VXALk4q7 From 238406ae1d6ef4c0b2b9b6a7dd1b5391aadff7c6 Mon Sep 17 00:00:00 2001 From: RavingManiac Date: Tue, 14 Jul 2015 19:52:46 +0800 Subject: [PATCH 02/28] Tweaks to storage items --- code/game/objects/items/weapons/storage/bags.dm | 6 +++--- code/game/objects/items/weapons/storage/fancy.dm | 3 ++- code/game/objects/items/weapons/storage/storage.dm | 3 ++- code/modules/research/xenoarchaeology/tools/tools.dm | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 8be4acb12c9..295c8db5b0b 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -74,7 +74,7 @@ icon_state = "satchel" slot_flags = SLOT_BELT | SLOT_POCKET w_class = 3 - max_storage_space = 200 + max_storage_space = 100 max_w_class = 3 can_hold = list(/obj/item/weapon/ore) @@ -87,7 +87,7 @@ name = "plant bag" icon = 'icons/obj/hydroponics_machines.dmi' icon_state = "plantbag" - max_storage_space = 200 + max_storage_space = 100 max_w_class = 3 w_class = 2 can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown) @@ -245,7 +245,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "cashbag" desc = "A bag for carrying lots of cash. It's got a big dollar sign printed on the front." - max_storage_space = 200 + max_storage_space = 100 max_w_class = 3 w_class = 2 can_hold = list(/obj/item/weapon/coin,/obj/item/weapon/spacecash) diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index e352dd2c958..6f23e6f9501 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -46,6 +46,7 @@ icon_state = "eggbox" icon_type = "egg" name = "egg box" + storage_slots = 12 can_hold = list( /obj/item/weapon/reagent_containers/food/snacks/egg, /obj/item/weapon/reagent_containers/food/snacks/boiledegg @@ -53,7 +54,7 @@ /obj/item/weapon/storage/fancy/egg_box/New() ..() - for(var/i=1; i <= 12; i++) + for(var/i=1; i <= storage_slots; i++) new /obj/item/weapon/reagent_containers/food/snacks/egg(src) return diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 0bec6598b08..60cfa4e1bae 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -206,9 +206,10 @@ /obj/item/weapon/storage/proc/space_orient_objs(var/list/obj/item/display_contents) + var/baseline_max_storage_space = 28 //should be equal to backpack capacity var/storage_cap_width = 2 //length of sprite for storage box start and end var/stored_cap_width = 4 - var/storage_width = min(max_storage_space*8,284) + var/storage_width = min( round( 224 * max_storage_space/baseline_max_storage_space ,1) ,284) storage_start.overlays.Cut() diff --git a/code/modules/research/xenoarchaeology/tools/tools.dm b/code/modules/research/xenoarchaeology/tools/tools.dm index 6d281eeedb7..bc9d0ca21f5 100644 --- a/code/modules/research/xenoarchaeology/tools/tools.dm +++ b/code/modules/research/xenoarchaeology/tools/tools.dm @@ -30,6 +30,6 @@ icon_state = "satchel" slot_flags = SLOT_BELT | SLOT_POCKET w_class = 3 - max_storage_space = 200 + max_storage_space = 100 max_w_class = 3 can_hold = list(/obj/item/weapon/fossil) From 2a44128b785ea223db46bd8351d24352846323e6 Mon Sep 17 00:00:00 2001 From: Kearel Date: Thu, 31 Dec 2015 17:54:25 -0600 Subject: [PATCH 03/28] Modifications to actor verb, orion trail, and board game. Orion Trail only works when power is on now. 'Join as Actor' verb will now prompt you to make sure. Boardgame can now be picked up by those viewing it (makes it easier to view) --- code/game/antagonist/outsider/actors.dm | 3 +++ code/game/machinery/computer/arcade_orion.dm | 2 ++ code/modules/games/boardgame.dm | 18 +++++++++++++----- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/code/game/antagonist/outsider/actors.dm b/code/game/antagonist/outsider/actors.dm index 013d7348fb4..7d5deb39e76 100644 --- a/code/game/antagonist/outsider/actors.dm +++ b/code/game/antagonist/outsider/actors.dm @@ -48,6 +48,9 @@ var/datum/antagonist/actor/actor if(!MayRespawn(1)) return + var/choice = alert("Are you sure you'd like to join as an actor?", "Confirmation","Yes", "No") + if(choice != "Yes") + return if(istype(usr,/mob/dead/observer) || istype(usr,/mob/new_player)) if(actor.current_antagonists.len >= actor.hard_cap) diff --git a/code/game/machinery/computer/arcade_orion.dm b/code/game/machinery/computer/arcade_orion.dm index 32fe89966fb..b713e69fb2d 100644 --- a/code/game/machinery/computer/arcade_orion.dm +++ b/code/game/machinery/computer/arcade_orion.dm @@ -85,6 +85,8 @@ view = ORION_VIEW_MAIN /obj/machinery/computer/arcade/orion_trail/attack_hand(mob/user) + if(..()) + return var/dat = "" if(event == null) newgame() diff --git a/code/modules/games/boardgame.dm b/code/modules/games/boardgame.dm index a5c11902889..56f8c968a53 100644 --- a/code/modules/games/boardgame.dm +++ b/code/modules/games/boardgame.dm @@ -1,8 +1,3 @@ -/*TODO: - implement icon loading that is efficient using browse_rsc - implement being able to move pieces -*/ - /obj/item/weapon/board name = "board" desc = "A standard 12' checkerboard. Well used." @@ -14,6 +9,13 @@ var/board = list() var/selected = -1 +/obj/item/weapon/board/New() + ..() + var i + for(i = 0; i < 12; i++) + new /obj/item/weapon/checker(src.loc) + new /obj/item/weapon/checker/red(src.loc) + /obj/item/weapon/board/examine(mob/user, var/distance = -1) if(in_range(user,src)) user.set_machine(src) @@ -21,6 +23,12 @@ return ..() +/obj/item/weapon/board/attack_hand(mob/living/carbon/human/M as mob) + if(M.machine == src) + ..() + else + src.examine(M) + obj/item/weapon/board/attackby(obj/item/I as obj, mob/user as mob) if(I.w_class != 1) //only small stuff user.show_message("\The [I] is too big to be used as a board piece.") From a8cea3862ddcf6affbfd18663818b4a0b9ed6b02 Mon Sep 17 00:00:00 2001 From: RavingManiac Date: Tue, 5 Jan 2016 22:04:33 +0800 Subject: [PATCH 04/28] Backpack and box storage capacity set to 16 and 8 respectively. Maximum w-class set to 4 and 3 respectively. Storage box sprite made lighter to improve visibility against dark backgrounds. --- baystation12.int | 7 +------ .../objects/items/weapons/storage/backpack.dm | 4 ++-- .../objects/items/weapons/storage/storage.dm | 14 +++++++------- icons/mob/screen1.dmi | Bin 169008 -> 169010 bytes 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/baystation12.int b/baystation12.int index d1078d03e5e..b82874fded5 100644 --- a/baystation12.int +++ b/baystation12.int @@ -1,11 +1,6 @@ // BEGIN_INTERNALS /* -LAST_COMPILE_TIME: 1447913478 -DIR: code code\game code\game\objects code\game\objects\items code\game\objects\items\weapons code\game\objects\items\weapons\storage code\modules code\modules\mob -AUTO_FILE_DIR: OFF MAP_ICON_TYPE: 0 -LAST_COMPILE_VERSION: 507.1286 -WINDOW: code\game\objects\items\weapons\storage\storage.dm;code\game\objects\items\weapons\tape.dm;code\modules\mob\inventory.dm -FILE: code\game\objects\items\weapons\storage\storage.dm +AUTO_FILE_DIR: OFF */ // END_INTERNALS diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 5aeec96eb8a..29a62117f35 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -22,8 +22,8 @@ ) w_class = 4 slot_flags = SLOT_BACK - max_w_class = 3 - max_storage_space = 28 + max_w_class = 4 + max_storage_space = 16 /obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W as obj, mob/user as mob) if (src.use_sound) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 6290f698844..c6ee578dcee 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -12,8 +12,8 @@ var/list/can_hold = new/list() //List of objects which this item can store (if set, it can't store anything else) var/list/cant_hold = new/list() //List of objects which this item can't store (in effect only if can_hold isn't set) var/list/is_seeing = new/list() //List of mobs which are currently seeing the contents of this item's storage - var/max_w_class = null //Max size of objects that this object can store (in effect only if can_hold isn't set) - var/max_storage_space = 14 //The sum of the storage costs of all the items in this storage item. + var/max_w_class = 3 //Max size of objects that this object can store (in effect only if can_hold isn't set) + var/max_storage_space = 8 //The sum of the storage costs of all the items in this storage item. var/storage_slots = null //The number of storage slots in this container. var/obj/screen/storage/boxes = null var/obj/screen/storage/storage_start = null //storage UI @@ -206,10 +206,10 @@ /obj/item/weapon/storage/proc/space_orient_objs(var/list/obj/item/display_contents) - var/baseline_max_storage_space = 28 //should be equal to backpack capacity - var/storage_cap_width = 2 //length of sprite for storage box start and end - var/stored_cap_width = 4 - var/storage_width = min( round( 224 * max_storage_space/baseline_max_storage_space ,1) ,284) + var/baseline_max_storage_space = 16 //should be equal to default backpack capacity + var/storage_cap_width = 2 //length of sprite for start and end of the box representing total storage space + var/stored_cap_width = 4 //length of sprite for start and end of the box representing the stored item + var/storage_width = min( round( 224 * max_storage_space/baseline_max_storage_space ,1) ,284) //length of sprite for the box representing total storage space storage_start.overlays.Cut() @@ -295,7 +295,7 @@ /obj/item/weapon/storage/proc/can_be_inserted(obj/item/W as obj, stop_messages = 0) if(!istype(W)) return //Not an item - if(usr.isEquipped(W) && !usr.canUnEquip(W)) + if(usr && usr.isEquipped(W) && !usr.canUnEquip(W)) return 0 if(src.loc == W) diff --git a/icons/mob/screen1.dmi b/icons/mob/screen1.dmi index 960bcfc32b2ecca9d5c5850d189136a6a6040a21..d2220fffd14a651ed175b7b78f80948138bec6c3 100644 GIT binary patch delta 8771 zcmYLOXEC=z{1aN(9kclo>%7B03>@uTi20b42v$C8I=S5IssniQZeH6D4{L zA&fqZ@p+#2z25Kq*y}obU+3(#?{lBE_PTdfG2}}zBs3iK6+CE*ultA^Ib;j=VO=XJ z_URrbh$3h4OV(2;jTS5xQd`XseESlYK-`J6umf{~&g(<%z=9xUkW&`XFFCzeT0yz){HpyTUhiIeqx+!PdBRF^!>kC9s3lX5H(tCsMmr)d5_U z8J|@s;@L6$rUioLdTM=YiQ0Lg$OMakv#xNoqr;Uxr#fvndn`o=nfI;$$Kz1MxEf#E zj8~UstgFns^Uo*3alrANA14!R9xRpK()poZ-52|3#R1{vyqSElJ&!+|@n}&o&TKGP z2~;9PL|g275K4AJ&K4ck)QfN3uyKtEI44DvMg@lF=iJKg3;0bLd!)Nu)^>zOHg&sC zIvasN!|Z?8;$PTIV^<3|n=#*bMNcvMApx3)+GpphO@2>F8gOyQwb(axy6>VNwrE(T z^6)Rv0D#H(uB9;7JMBG290c@JGh9`La=ZV7XAinz_5m+2&9P9Ewdb4c^kbzRnqi zL`Qyw^s7f2XdkD>w@vb$VBdDYE=Uj1w|V6N;rl}Voc&R-Z1BsicP8@fyowCWPZK=~ zY??)&e%SPki{#mu`!}d`W>)rrYLJ0}SJxNltNypwrU;?un~x3gMev&Zh&YHZp%l^J zcnEf-%*J1K|DFYL$6^a8TJaYu)R~7yM zSWzO{VclaP_240cf9xG7WWA5QDH3g4)XQbO=!W+GIaAWG=ZX3DKxU8TiZjAcu26&u zWcXU)(idynTzomVIzP9SOnO}@SG4@K9-k_qm=Df~sjZ!WO4A*#PJeu+WPw-^{wd)X zLXj;(#v(;xNS7=n$L~jZf`LDVLc+_3?n?=C;j9GROurMPP+$(00#~%?5!zdpz9X`1 z0ls_Da3_=V=sm0X5!n?tY@;Qh^k3%5%c zy?D+?OTfe)k!Q7*ufy^w+fo#B(yNBzn>^>sXzTuyD{%evtf}YicKiN_y}ka#sO|l| zR|U|&GEBW{oY-wzs+Pm*t55Nfkx{sS!e)*LevTAwwvfp*^@f~-Y1oS`{aoN^^=sF` z3fnyXY9DN(MP!M!3URMBWLgRV{my&7PuhF=+6l_oMV_UUYy?;PeU24R9g;oE`J7FyFqg;Yfog^Xb%y1SAS4{b>#Kz{xW?c%a6u~ zbhcOi`>vb0n}Y3o+ym#vfJhLC+@ux1M@JEYp`aIs@aB5|5a4i#Pi){%K`l{BKxs;& zz1p~3g1Zfq$*#1l*0@ly3}(-HZgjL(KkM?sQw44?=1qp8-3)5G(`>`WSKVIq$^mQm+;F<*Tj1T#}-M!`>@1 z-02(>yx`$VhwB~-;4+9~688^ zLA5n5W&n_a)BIp<2_=8(nli`UGS(x|BrJ8p%9qwQy1(p|7s@a-FVY^eMbg79DO-rQ z#&u`jt0TXBMn>X6(4$^8AtzaFKHics#=dHFGU;UYi1Ni$wsM{=L=^gR)kBujx%Z#D z1nIRd!MM1@HAYoP^t-jS*W1~|tYM6nEIX9rz;T0!(pNK1#}UoA615vjm`Co2#r)}Q z>-k(iLglZK2anY-HD%swf#9#~CgLA1yxzg+>yqJ474b|W#iCR)UGnqB38kpFFh44@ zx3}XDCWi-Db{L=k5J2X5ik=4%(%mKO`FXe@El#v24u34P^xEd&&LQiMuei*2;#1dM zz^WEdS1ZU@qB?&*7r-rf;T-?*y{)9L><~FzAo>`?nPO5NGOeVUpy34tA9L31_ zctu#U8~e$!#rc23)0SE2Lezi9@AY0}w{I=27LMe~M8XUC7#?&vM?C5|h()(opfYvz zm$HZO?>>@`Q;Ki#0cKICK~;N`vWDAm{t@|cCFRe9l3QO7kcnFpQ7tN=s*#md;OU!_IIyYV}VGg*S_w>toEwWAD1WblMmb z-wUlld(7mCL!Ubw?N-)#^(e149U#eFGkhAQJ#Y!9ct5%0H^o z8l-ctt$iJ{prz}Y6IJDl23G7E5xZM4d#Q|M0P|MkO{$%^5GXx(I)?SY`+zaxdA2A* zQW%|fv=ktwaZuWJWPD^tsI(d!lne#p+XlP+MJ#c3b;mBf_?24Wv>Ub0KZMVhVo zz?I>3Z!%8fw=1!}!Qv4-GY*EQw_c>>b>=hH?9@nel}&)C2ap%0UbN4K-a9>rdLXqeS%gl<44r zQ&tv*yD(gGmx2meunU`O4$)cpTUcaZxi6dQs#>9Kk}Dh46M|}ke;QAKHc1OK#-f$` zyv_@L?K39Q38&s_zPjjrPn&e}HSH-p4Lja0xojThzKWr^MNFY6LY9nR{KXi0OBhy@ zQwoW2L@fSDuh)8AJQy2PKQ<=xQm=t^S@6ww;O|CH6V~jQ-Qrb{6$hDCQ8n1Ad+Auq zW^3r@tTM*K$huLd)8ZGf$ zcT6gYb>}Awp%OcI8&{;iOMSd> zZC-63&&Qwn5)UZYXcHRSnzr;il*Gs7JkyxJifiDJZkZqh`f~u|Z{_xv4mglZRmu~G>psz^7_%t=0 z?199cl=P&E3ZX7-}ejlXjZ2YykiO_K9-O3JX|^VQFQCScf)~>s!l6o zd*B{+<$-VrN{XAL@Ot!#FQY+v$C1CJ_n3mkTo9Pi|Ks*~E}&3-^dV$e!ac>$VI5dE zFjvUr1#0+tyQmW?O-n{Dn-UzTucu(P5d|1pdzDC=&O#0pOnMNKm`gEkA^#hM`GIEEv zmP<*S5GJdW7Wzzab&rdX*uZ&|whCY=J(!>_q5uWy4K zN>^NF(9_+n57v#Cxo(Ty=kPsQWo#ZI$TeA6>-mKhJpYs^Mr5EtbCND5rRD}y6yNH~ zQ=C)O=>htqnwZ?EtL6M>x@AWGjZVQcgQ#&rd&UnPlq-Pwvnjt#aBs$XuF0Rbmjd$F zuWIfi)Wedwm>4WR18W&6{a;Q}1=?$t-pFx7mh5TRzuf0^4pAIO3*^-$Y|3w=GuB23 zxd;j>7T=f?sxg`!RV5Zl^ZvZXIzv_aM|EC^rmPEYzO}cGi7++s2v0CO6xerNC#;b3W zWQw5*-@Iey_KnlLiTGb@dDJ*H&31X1=;TH;>bs{Ln|q$MNs;I2vR(E_5nkkl=kZ$; zK%p5kIc22`Ko=XcvM#tVpGpE}&d%ev=or%Z#NLtP9wMZ7^3HS&e?{iGJ;_BQ_y(LDej7e54K-Fx4F9a;V;h|+YQn0 z`iO-PhCEtfkV8ud%fYB@`6 z|L&n}GvQYIw*HQ^;2Z)M-RY(cwV8~$Pux>{+nXhy!Pf?|3Ik2U+{1&RK|{#f1P-)G zo{p=vj>bbtr%JR*lk#M9mPO`yt$KMs?u)&IVy(o1>xN_oU|7nUJ0iPiX2F>r%#JcDMLus4Us=dRzFaT}WK zz;mwNxeIskJ43Y8PZbEE3`~GIoqSMsZlyf1X?x62JdoN}O4fQ9PI-NXHA8!|vnmv9 zAZ=i|nDyg+qFFjBt~Z_KDBX{bZ0vM0BqbnH@HlrT2M?b<4Eb39M-f*iT9+gSMp_5* z_}e`k52?LF?7|ocx>04K>@xENMfd9OAo` ziMph`ixR7Oj$QWmBPO`ZKuxIFnyDi>g{QJW{q2Dc6(GxVH{DW|!Q@Vm#b#k24bMi= zhlg~|mZlcolS$%0@=uxDWcgNLkl*%U@BtZCbUjMsM~fpr60jkXUT_HxF^|GOjtYNO zXRTi2iPy^7phs4ZsLA!RZI+44vjPL4(m|^$^P%O?>u+O}oRGD|hbU-J4g3CCgtk6^ z+bQgBZh0Z5JvOY`s-shs=xK|{B?E8HoGuxG3T5^!IwAG-Y#my{Fx|njC~B`_w2H0} zNd?Q&kELJ1$5CJQN5%O$s-I*-XVpTI&rdYM`_|OISC$SuloV?61R3IEMs$J1_vdfF z_GViB#$QEqYskPzET3=Zd*Bg<=_qL4EiGoO+>fovGGRVI6?<+A2OFe4vS-BpRfm~n zFN^3Y?%aqmEC;huA@cs&xxxz1xpBgmnB6XDscVO>b$L4rGX%~&s>5A~;=%u7(=$&u zU%ir$H(Hs|boVUP2sC{s!UBl%eUE-3`O#rfWmCdvc&i*-3qL|0W&$yoGmtH0c^=vF zUG#gK|Gt)sOK*mh;&=(`EN#+<4_9!#S9IJ96gnyG_DJI?$(Y|ELwvD=lP_V~dpTjH zo$S9_u-|8Grh^gjxv;udHN5?U1)<#`JT}vMf{3ez5-jAd{$?p_DiCe)&D@iWUaHR^ zV^esX$x(@y{k>OFK#Aw04V!>HIYi;r=o67!rTpm2cDqiK3J-_cT*pQ9U6A`7w=0CW zH+|5y0{%r9)eBOF3#+fS1XTm0fef31r}Rh|A67ZfIau-Q^^3j)a7xsQRkS?BYr|fK zHW?<|wQ_59q|cL&9{@_WENyT~@zF{GEAPVE>ih(Aa)QXGVl0P#i5GmXKU+?!BP#S* z-SjPDI)tZazSx`L+#|x@7wHuLIvTf0N~5|uP``DT({IVoaaS~yY@`K7sUB7g(YiD9 zWp|j8aPeW?x#9Ui`>$Y|_3%6|yH3$QZJR3|5?T_%Jdw4vI)gE-K{94 zVpgWMm9@P}e2Ac%n_EJm7C(;aC8M^GKP$|cfr)dt?N}GlOANa9`~faC^BTtVwkx+1 ztqZ}GRa|_@8s->XYrX#`^SER^m|gq9ul|Jxcf6L;PRwff#ugg`x#VyV|9Z2u^rjkb zVQtt|@h#6DU}Ktj*xY+O)mEz{cDTeKWxU?8t7fE9<9WW`ktN2Y!%{P0Eyl79_v+rd zf#vO*X|-~5SR^hhQ4**38At)$?9~WJ)tH}|pKQdz9JePaL$jxIve3p-PQ6hPcI7YJ z(wL?z9yE#~^17ba&s#Hc&}+Gvz1seS2%Rc>mR-gpX%UP|&^y?vqSKHDNIyNcwY4n~ z?&wsHYoLVlk{rM}?vRYH!VaF1DN!Mr+dZD`X0X@wvS?dSZySodJK)9Dy^Bqx9Y>p1>9}ZS zift5oe+W69Rm%~l`~3Oyr`B7f^crCWB4#1Htv-fiq^}Y4nqCJ?!(=BfpIlz5_wAR# zxJvd~FT@+oZ>$PV|btBv?3bF^;7c=+wEvW=MF1q&Pq zQIgB${G!}XNJOVzhkiG-Q`gWaR|n7U6})V0 z(r=hT{Q~@sZy_ItgV~i*sW;!@;Zatpt2{EWU_;1$eA$OukiWCWXl}x(MXYFU$ODwi zM3uoVh_rLWl65JFq<7sn6KzKx8S?zadETRp&qWr7gW(`su>%dKc@4S=vwy$7nJCq!uwV=*v5Ja%tPUfB$ZJ@+o=rXLiw|NSGC zcd>*Ic03M^CM&(w(z5W?|1of+rwE;2`f)FoA>Hmi2fd(il@)5Tzc|#%7=cn|V8_#! zZm;_$h+PzHaMVwsNhuAUETo`S<|X(zF9lD}r}Xqf_rD0yP9uJi0VMY zM>y3=O6j#qQ=TeSclg_GEi^gdOV-ws&6Sa48z|Pv|8~5P4&NV&x*RIwGOfSNl$yPB zolWs?6-98vviNccoaNUhWDS2+H5&Kc2glFzI6XF!1{THvdi3NJ9VHXMk;8e&%xH28k;C47ALe- z)TI>POGRi9S{Yxs68jvF|77LOvolgWg(e&KJ$Qf%Fq-}>yC%f^we`lg3I2Qk^NU>n z<_utCx{!}^TJ|77KJq_)O_P`9503S51A(MVm=!Yw_KMtX@lzG%vh!e8w(QPz&~ie1 zf&WTjHa+@;{JW=`6{hEHz#-b+i)%eXmn$?J{4(UaLq^+(ol5=FJe!^7=id#^^__)} zna}xx3DXU0Ro>G%(t1e%xi>mf3p^8g0;BGpa|+Qql7b_0bViCEEJoy# zh)~mRVL_mC6)hF%KZMqCSuY56g6k>Sh~(eYn#G|qmpVMwcE7J+5_Evwrc7q$n%(f# z%KP)`7IEgluGZ9+7P0RxBXr(l@t1^br8ba$?|}0%Jt7vi&V6)1lFd%v%v`wU%l$lZ zGh-faoRLhWH%!+st(a7eheCE9`(oYrw4uziDQIoWi7?e6j*Q(XVYQs6U`G5R)Cs|E z%62Rs5}WAkJQ%*s-Um2EMpM&+gm*nur%E{fN1AwU`~n54eukgl4uWco5hJ`Sp%?3s z1-9STt8OX}K2ZV{aV5p(pHN8Nu3aGYI?zXcB9|jdWsok zWPk2w5YlV#z{I4Hg_G%~q-X#Z9&N_ceS@_&xw&JhdkYsJ=H?4N6piOaqljV3GdwC? zyJ7tcCx5cTFa;Bn20^jOr2cm#Q`Y)?W!rD4WBi7Y`M^^-Ir>^L=M6D7|7V_n3BH_} zAspYD!AV=C^LOOgg3LW=)azCX3V%u)?*id~%%`u%mEXFLZ4r-Ixb^}A_Ki4GAMdaK zk0~PuS5#0mgG#jgPuau>{Ry?E-{OTr!D505_A@^m4?&pYW$3W`o3e^*JYgaR+@sZZ zX8QW^W=0(XV`DNtx(_Nr9%+g2!%O2)AgLGEQGgz@Q}XTCbrI!tj$^ z`>bnXY6=UqTC+qAMvigteR1*delSZQx-|$vZBU+_SZ=D-ngK zOS*WM+1m;WGH*ZsgRgOwr$mxnD2t5Uu6NRd5jCM&+c>{vaY{rx*{8SqdF^Gac<(WV z4LrFD^dI(j3cW?(HwkQg0;C8Wo|MPh!=}14d4b7>SY6?{8~BAx-Dmr!p#~-<_*;`{ zN7;w3{K!;dPW`!a_P^dY(7^vKUgf+)r0DpJa!)~5nV{f7;&YK)hK;9#m#A9QW%ECY z>mNCdyfDw|I1u{I@=yDO?ALz;CfiqK-}oC&|SnHw7gK#{;j#iE+Cs>m~| z-gA?ywDLop5^DYq%0@nfoPii$EspvcDL_v>&Pb=a{^g&sOmC7TWk1!%nqk9H=en$j zzeR)iDbz}XWZ>qwEX-8Z9d8qOn~g>-?2j`Y#qGu3=TK~B)0Bl#D(GD)iJ@H~@N})7 zg9RBiZrW^)MYU6w!X|MI%bC|Ht327SDz1~KS9|*|6l`avr_?O@?D!#t3{HGIPXFfc z4kdJwE=Y9H^TPO#{EaYVj-9dne3TLl)hqj5$j>=@80s`C7UR+Y1a}JkWX;gfh8J^e zW95%WgP}if*yA!%5GwP6+Qke{R*inVU|vJL_z z2W!4n6+4DD4L(sax+FI!`+%-c=D$-q+)NoDClW{UL1nzEf)MrNnk|@r8P}dTAl6=hT0%UL!*qf6&Veoy)ZPQ~2yj8?Vaqhl8;o9)+ zGoiV5(*@gylhhkOkW|TFv&m@y@wrnP~H_ zhjenY=#GF!H{HTM!7nD{a+s@A@88IWDPU%hDAF(mEDB}^kkKh%1yDeJZwiWg&*F{rT$n;r9#On?Ee5PZ}D6J delta 8769 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 From e1f58161ac3e69a9c2157560380b64a005cf0dcd Mon Sep 17 00:00:00 2001 From: Hubblenaut Date: Thu, 10 Dec 2015 20:46:22 +0100 Subject: [PATCH 05/28] Diverse Police Tape fixes/tweaks --- code/game/objects/items/weapons/policetape.dm | 38 +++++++++++++----- icons/policetape.dmi | Bin 2914 -> 1845 bytes 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index f204a971feb..98e5c172c33 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -22,6 +22,19 @@ var/list/tape_roll_applications = list() var/tape_dir = 0 var/icon_base = "tape" +/obj/item/tape/update_icon() + //Possible directional bitflags: 0 (AIRLOCK), 1 (NORTH), 2 (SOUTH), 4 (EAST), 8 (WEST), 3 (VERTICAL), 12 (HORIZONTAL) + switch (tape_dir) + if(0) // AIRLOCK + icon_state = "[icon_base]_door_[crumpled]" + if(3) // VERTICAL + icon_state = "[icon_base]_v_[crumpled]" + if(12) // HORIZONTAL + icon_state = "[icon_base]_h_[crumpled]" + else // END POINT (1|2|4|8) + icon_state = "[icon_base]_dir_[crumpled]" + dir = tape_dir + /obj/item/tape/New() ..() if(!hazard_overlays) @@ -93,19 +106,26 @@ var/list/tape_roll_applications = list() /obj/item/taperoll/update_icon() overlays.Cut() + var/image/overlay = image(icon = src.icon) + overlay.appearance_flags = RESET_COLOR if(ismob(loc)) if(!start) - overlays += "start" + overlay.icon_state = "start" else - overlays += "stop" + overlay.icon_state = "stop" + overlays += overlay /obj/item/taperoll/dropped(mob/user) - ..() update_icon() + return ..() /obj/item/taperoll/pickup(mob/user) - ..() update_icon() + return ..() + +/obj/item/taperoll/attack_hand() + update_icon() + return ..() /obj/item/taperoll/attack_self(mob/user as mob) if(!start) @@ -142,13 +162,13 @@ var/list/tape_roll_applications = list() for(var/dir in list(NORTH, SOUTH)) if (possible_dirs & dir) TP.tape_dir += dir - TP.icon_state = "[TP.icon_base]_[TP.tape_dir]" + TP.update_icon() if(possible_dirs & (EAST|WEST)) var/obj/item/tape/TP = new tape_type(start) for(var/dir in list(EAST, WEST)) if (possible_dirs & dir) TP.tape_dir += dir - TP.icon_state = "[TP.icon_base]_[TP.tape_dir]" + TP.update_icon() start = null update_icon() usr << "You finish placing \the [src]." @@ -207,8 +227,8 @@ var/list/tape_roll_applications = list() break if(!tapetest) var/obj/item/tape/T = new tape_type(cur) - T.icon_state = "[T.icon_base]_[tape_dir]" T.tape_dir = tape_dir + T.update_icon() if(tape_dir & SOUTH) T.layer += 0.1 // Must always show above other tapes if(cur == end) @@ -227,7 +247,7 @@ var/list/tape_roll_applications = list() var/turf/T = get_turf(A) var/obj/item/tape/P = new tape_type(T.x,T.y,T.z) P.loc = locate(T.x,T.y,T.z) - P.icon_state = "[src.icon_base]_door" + P.update_icon() P.layer = 3.2 user << "You finish placing \the [src]." @@ -251,7 +271,7 @@ var/list/tape_roll_applications = list() /obj/item/tape/proc/crumple() if(!crumpled) crumpled = 1 - icon_state = "[icon_state]_c" + update_icon() name = "crumpled [name]" /obj/item/tape/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) diff --git a/icons/policetape.dmi b/icons/policetape.dmi index 0422ecb22f332da05650afeed6e940b12ffa7b1b..42095beef70ce74625454eb3791be58b3e764e76 100644 GIT binary patch delta 1844 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 Date: Wed, 6 Jan 2016 05:30:41 +0100 Subject: [PATCH 06/28] Cleanbot cleans closest dirt first --- code/modules/mob/living/bot/cleanbot.dm | 134 ++++++++++++++---------- 1 file changed, 78 insertions(+), 56 deletions(-) diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index 73310108523..57f907ec25d 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -26,6 +26,8 @@ var/blood = 1 var/list/target_types = list() + var/maximum_search_range = 7 + /mob/living/bot/cleanbot/New() ..() get_targets() @@ -36,6 +38,25 @@ if(radio_controller) radio_controller.add_object(listener, beacon_freq, filter = RADIO_NAVBEACONS) +/mob/living/bot/cleanbot/proc/handle_target() + if(loc == target.loc) + if(!cleaning) + UnarmedAttack(target) + return 1 + if(!path.len) +// spawn(0) + path = AStar(loc, target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id = botcard) + if(!path) + custom_emote(2, "[src] can't reach the target and is giving up.") + target = null + path = list() + return + if(path.len) + step_to(src, path[1]) + path -= path[1] + return 1 + return + /mob/living/bot/cleanbot/Life() ..() @@ -46,7 +67,7 @@ return if(cleaning) return - + if(!screwloose && !oddbutton && prob(5)) custom_emote(2, "makes an excited beeping booping sound!") @@ -74,65 +95,64 @@ spawn(600) ignorelist -= gib - if(!target) // Find a target - for(var/obj/effect/decal/cleanable/D in view(7, src)) - if(D in ignorelist) - continue - for(var/T in target_types) - if(istype(D, T)) - target = D - patrol_path = list() + // Find a target + + if(pulledby) // Don't wiggle if someone pulls you + patrol_path = list() + return - if(!target) // No targets in range - if(!should_patrol) - return + var/found_spot + search_loop: + for(var/i=0, i <= maximum_search_range, i++) + for(var/obj/effect/decal/cleanable/D in view(i, src)) + if(D in ignorelist) + continue + for(var/T in target_types) + if(istype(D, T)) + patrol_path = list() + target = D + found_spot = handle_target() + if (found_spot) + break search_loop + else + target = null + continue // no need to check the other types - if(!patrol_path || !patrol_path.len) - if(!signal_sent || signal_sent > world.time + 200) // Waited enough or didn't send yet - var/datum/radio_frequency/frequency = radio_controller.return_frequency(beacon_freq) - if(!frequency) - return - closest_dist = 9999 - next_dest = null - next_dest_loc = null - - var/datum/signal/signal = new() - signal.source = src - signal.transmission_method = 1 - signal.data = list("findbeakon" = "patrol") - frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS) - signal_sent = world.time - else - if(next_dest) - next_dest_loc = listener.memorized[next_dest] - if(next_dest_loc) - patrol_path = AStar(loc, next_dest_loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id = botcard, exclude = null) - signal_sent = 0 - else - if(pulledby) // Don't wiggle if someone pulls you - patrol_path = list() + if(!found_spot && !target) // No targets in range + if(!patrol_path || !patrol_path.len) + if(!signal_sent || signal_sent > world.time + 200) // Waited enough or didn't send yet + var/datum/radio_frequency/frequency = radio_controller.return_frequency(beacon_freq) + if(!frequency) return - if(patrol_path[1] == loc) - patrol_path -= patrol_path[1] - var/moved = step_towards(src, patrol_path[1]) - if(moved) - patrol_path -= patrol_path[1] - if(target) - if(loc == target.loc) - if(!cleaning) - UnarmedAttack(target) + + closest_dist = 9999 + next_dest = null + next_dest_loc = null + + var/datum/signal/signal = new() + signal.source = src + signal.transmission_method = 1 + signal.data = list("findbeakon" = "patrol") + frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS) + signal_sent = world.time + else + if(next_dest) + next_dest_loc = listener.memorized[next_dest] + if(next_dest_loc) + patrol_path = AStar(loc, next_dest_loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id = botcard, exclude = null) + signal_sent = 0 + else + if(pulledby) // Don't wiggle if someone pulls you + patrol_path = list() return - if(!path.len) - spawn(0) - path = AStar(loc, target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id = botcard) - if(!path) - path = list() - return - if(path.len) - step_to(src, path[1]) - path -= path[1] - return + if(patrol_path[1] == loc) + patrol_path -= patrol_path[1] + var/moved = step_towards(src, patrol_path[1]) + if(moved) + patrol_path -= patrol_path[1] + + /mob/living/bot/cleanbot/UnarmedAttack(var/obj/effect/decal/cleanable/D, var/proximity) if(!..()) @@ -145,7 +165,7 @@ return cleaning = 1 - custom_emote(2, "begins to clean up the [D]") + custom_emote(2, "begins to clean up \the [D]") update_icons() var/cleantime = istype(D, /obj/effect/decal/cleanable/dirt) ? 10 : 50 if(do_after(src, cleantime)) @@ -155,6 +175,8 @@ if(!D) return qdel(D) + if(D == target) + target = null cleaning = 0 update_icons() From 39bbca416ab7c0523cf260405982cbd86360e369 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 6 Jan 2016 17:42:56 +0100 Subject: [PATCH 07/28] Adds missing istype() check before the secure brief case emag check. Fixes #11900. --- code/game/objects/items/weapons/storage/secure.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 8b11055d40f..51c53bc64c6 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -33,7 +33,7 @@ attackby(obj/item/weapon/W as obj, mob/user as mob) if(locked) - if (emag_act(INFINITY, user, "You slice through the lock of \the [src]")) + if (istype(W, /obj/item/weapon/melee/energy/blade) && emag_act(INFINITY, user, "You slice through the lock of \the [src]")) var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src.loc) spark_system.start() From 9134827dd6eb4552e4ecc570de6b572d7c2deb10 Mon Sep 17 00:00:00 2001 From: Kearel Date: Wed, 6 Jan 2016 15:04:04 -0600 Subject: [PATCH 08/28] Can now set things directly onto the board There are now checks in place for adjacency and consciousness so unconscious/dead people can't play checkers. --- code/modules/games/boardgame.dm | 116 +++++++++++++++++++++----------- 1 file changed, 78 insertions(+), 38 deletions(-) diff --git a/code/modules/games/boardgame.dm b/code/modules/games/boardgame.dm index 56f8c968a53..62abc1daa49 100644 --- a/code/modules/games/boardgame.dm +++ b/code/modules/games/boardgame.dm @@ -30,28 +30,49 @@ src.examine(M) obj/item/weapon/board/attackby(obj/item/I as obj, mob/user as mob) + if(!addPiece(I,user)) + ..() + +/obj/item/weapon/board/proc/addPiece(obj/item/I as obj, mob/user as mob, var/tile = 0) if(I.w_class != 1) //only small stuff user.show_message("\The [I] is too big to be used as a board piece.") - return + return 0 if(num == 64) user.show_message("\The [src] is already full!") - return + return 0 + if(tile > 0 && board["[tile]"]) + user.show_message("That space is already filled!") + return 0 + if(!user.Adjacent(src)) + return 0 + user.drop_from_inventory(I) I.forceMove(src) num++ + if(!board_icons["[I.icon] [I.icon_state]"]) board_icons["[I.icon] [I.icon_state]"] = new /icon(I.icon,I.icon_state) - var i; - for(i=0;i<64;i++) - if(!board["[i]"]) - board["[i]"] = I - break + if(tile == 0) + var i; + for(i=0;i<64;i++) + if(!board["[i]"]) + board["[i]"] = I + break + else + board["[tile]"] = I src.updateDialog() + return 1 + + /obj/item/weapon/board/interact(mob/user as mob) + if(user.incapacitated(INCAPACITATION_DISABLED) || (!isAI(user) && !user.Adjacent(src))) //can't see if you arent conscious. If you are not an AI you can't see it unless you are next to it, either. + user << browse(null, "window=boardgame") + user.unset_machine() + return var/dat = "" dat += "" @@ -68,7 +89,7 @@ obj/item/weapon/board/attackby(obj/item/I as obj, mob/user as mob) dat += "'#66CCFF'>" else dat += "'#252536'>" - dat += "= 0) - if(I) //cant put items on other items. - return + if(!usr.Adjacent(src)) + usr.unset_machine() + usr << browse(null, "window=boardgame") + return + + if(!usr.incapacitated()) //you can't move pieces if you can't move + if(href_list["select"]) + var/s = href_list["select"] + var/obj/item/I = board["[s]"] + if(selected >= 0) + //check to see if clicked on tile is currently selected one + if(text2num(s) == selected) + selected = 0 //deselect it + return + + if(I) //cant put items on other items. + return //put item in new spot. - I = board["[selected]"] + I = board["[selected]"] + board["[selected]"] = null + board -= "[selected]" + board -= null + board["[s]"] = I + selected = -1 + else + if(I) + selected = text2num(s) + else + var/mob/living/carbon/human/H = locate(href_list["person"]) + if(!istype(H)) + return + var/obj/item/O = H.get_active_hand() + if(!O) + return + addPiece(O,H,text2num(s)) + if(href_list["remove"]) + var/obj/item/I = board["[selected]"] board["[selected]"] = null board -= "[selected]" board -= null - board["[s]"] = I + I.forceMove(src.loc) + num-- selected = -1 - else - if(I) - selected = text2num(s) - if(href_list["remove"]) - var/obj/item/I = board["[selected]"] - board["[selected]"] = null - board -= "[selected]" - board -= null - I.forceMove(src.loc) - num-- - selected = -1 - var j - for(j=0;j<64;j++) - if(board["[j]"]) - var/obj/item/K = board["[j]"] - if(K.icon == I.icon && cmptext(K.icon_state,I.icon_state)) - src.updateDialog() - return - //Didn't find it in use, remove it and allow GC to delete it. - board_icons["[I.icon] [I.icon_state]"] = null - board_icons -= "[I.icon] [I.icon_state]" - board_icons -= null + var j + for(j=0;j<64;j++) + if(board["[j]"]) + var/obj/item/K = board["[j]"] + if(K.icon == I.icon && cmptext(K.icon_state,I.icon_state)) + src.updateDialog() + return + //Didn't find it in use, remove it and allow GC to delete it. + board_icons["[I.icon] [I.icon_state]"] = null + board_icons -= "[I.icon] [I.icon_state]" + board_icons -= null src.updateDialog() /obj/item/weapon/checker/ From 6ec929c14dbdc33cc6ef4366f1141091e745ff1e Mon Sep 17 00:00:00 2001 From: Kearel Date: Wed, 6 Jan 2016 15:12:05 -0600 Subject: [PATCH 09/28] should realistically fix merge conflicts I don't know actually if it will. --- code/modules/games/boardgame.dm | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/code/modules/games/boardgame.dm b/code/modules/games/boardgame.dm index 62abc1daa49..54a9866ea4d 100644 --- a/code/modules/games/boardgame.dm +++ b/code/modules/games/boardgame.dm @@ -89,19 +89,22 @@ obj/item/weapon/board/attackby(obj/item/I as obj, mob/user as mob) dat += "'#66CCFF'>" else dat += "'#252536'>" - dat += "= 0) + if(selected >= 0 && !isobserver(user)) dat += "
Remove Selected Piece" user << browse(dat,"window=boardgame;size=500x500") onclose(usr, "boardgame") From 7af61b9a6bde6d82b7f61926b2bb8cc5f7a8c278 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 7 Jan 2016 05:43:40 +0300 Subject: [PATCH 10/28] Fixes #11924 --- code/modules/surgery/other.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index ba9334d933a..7006d4ce069 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -88,7 +88,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message("\blue [user] has cut away necrotic tissue in [target]'s [affected.name] with \the [tool].", \ "\blue You have cut away necrotic tissue in [target]'s [affected.name] with \the [tool].") - affected.open = 3 + affected.status &= ~ORGAN_DEAD fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) From e9991c99aefa372b50903b9a8f97d72dd5419f30 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 7 Jan 2016 05:45:23 +0300 Subject: [PATCH 11/28] Fixes #11916 --- code/modules/surgery/limb_reattach.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm index aee13ede832..ed4c7f3b061 100644 --- a/code/modules/surgery/limb_reattach.dm +++ b/code/modules/surgery/limb_reattach.dm @@ -28,7 +28,7 @@ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/E = tool - user.visible_message("[user] has attached [target]'s [E.name] to the [E.amputation_point].>", \ + user.visible_message("[user] has attached [target]'s [E.name] to the [E.amputation_point].", \ "You have attached [target]'s [E.name] to the [E.amputation_point].") user.drop_from_inventory(E) E.replaced(target) From bc390c560314316f6f56db12c95ef5326a557667 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 7 Jan 2016 05:49:16 +0300 Subject: [PATCH 12/28] Fixes #11914 --- code/game/objects/items/devices/flashlight.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index a2707fd01f0..019bc2dece1 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -64,7 +64,7 @@ return if(XRAY in M.mutations) user << "\The [M] pupils give an eerie glow!" - if(vision.is_bruised()) + if(vision.damage) user << "There's visible damage to [M]'s [vision.name]!" else if(M.eye_blurry) user << "\The [M]'s pupils react slower than normally." @@ -79,7 +79,7 @@ user << "\The [M]'s pupils narrow slightly, but are still very dilated." else user << "\The [M]'s pupils narrow." - + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) //can be used offensively flick("flash", M.flash) else From f0678854ecbb49c8437ae7695624ff2a0f47e1a4 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 7 Jan 2016 07:06:20 +0300 Subject: [PATCH 13/28] Fixed monkey scooping. Again. --- code/modules/mob/living/carbon/human/species/station/monkey.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species/station/monkey.dm b/code/modules/mob/living/carbon/human/species/station/monkey.dm index d9d8347550c..c4ccc620649 100644 --- a/code/modules/mob/living/carbon/human/species/station/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/station/monkey.dm @@ -39,7 +39,7 @@ push_flags = MONKEY|SLIME|SIMPLE_ANIMAL|ALIEN pass_flags = PASSTABLE - + holder_type = /obj/item/weapon/holder /datum/species/monkey/handle_npc(var/mob/living/carbon/human/H) if(H.stat != CONSCIOUS) return From 0d7c52b869016e7f96f17f7460b66d6aea482f0f Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 7 Jan 2016 07:07:45 +0300 Subject: [PATCH 14/28] Fixes #11884 --- code/modules/mob/living/carbon/human/human.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 9e929fb88ff..ea64a798aa7 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1385,7 +1385,7 @@ /mob/living/carbon/human/MouseDrop(var/atom/over_object) var/mob/living/carbon/human/H = over_object - if(holder_type && istype(H) && !H.lying && !issmall(H) && Adjacent(H)) + if(H.a_intent == "help" && holder_type && istype(H) && !H.lying && !issmall(H) && Adjacent(H)) get_scooped(H, (usr == src)) return return ..() From 33f3056f1b2dfa13140a08498d3c2c8a7f8b1196 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 7 Jan 2016 07:13:40 +0300 Subject: [PATCH 15/28] Changelog --- html/changelogs/chinsky - stuff.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/chinsky - stuff.yml diff --git a/html/changelogs/chinsky - stuff.yml b/html/changelogs/chinsky - stuff.yml new file mode 100644 index 00000000000..c9fa37ab16f --- /dev/null +++ b/html/changelogs/chinsky - stuff.yml @@ -0,0 +1,5 @@ +author: Chinsky + +delete-after: True +changes: + - bugfix: "Can pick up monkeys / undress resomi now properly. HELP intent for scooping, NON-HELP for undressing." From 1b564bb179b2ea20aa1eeb66be41068aad4fb0e7 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Thu, 7 Jan 2016 11:28:17 +0100 Subject: [PATCH 16/28] Map and icon tweaks. Re-adds medical examination wall and chapel mass driver button. Ensures that the chapel crematorium button does not lose its default icon on icon update. Fixes #11915. Fixes #11894. --- code/game/objects/structures/morgue.dm | 3 +++ maps/exodus-1.dmm | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 8a9e29a0da2..58f89dc3fff 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -413,6 +413,9 @@ req_access = list(access_crematorium) id = 1 +/obj/machinery/button/crematorium/update_icon() + return + /obj/machinery/button/crematorium/attack_hand(mob/user as mob) if(..()) return diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index 94b3eee8057..a63e8658a69 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -1743,7 +1743,7 @@ "aHA" = (/turf/simulated/floor/tiled/dark,/area/chapel/main) "aHB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/hatch{name = "Command Substation"; req_one_access = list(11,24)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/substation/command) "aHC" = (/obj/structure/closet/coffin,/obj/machinery/door/window/eastleft{name = "Coffin Storage"; req_access = list(22)},/turf/simulated/floor/tiled/dark,/area/chapel/main) -"aHD" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled/dark,/area/chapel/main) +"aHD" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/button/remote/driver{id = "chapelgun"; pixel_x = 24; pixel_y = -24},/turf/simulated/floor/tiled/dark,/area/chapel/main) "aHE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled/dark,/area/chapel/main) "aHF" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/chapel/main) "aHG" = (/obj/machinery/door/window{dir = 8; name = "Mass Driver"; req_access = list(22)},/obj/machinery/mass_driver{dir = 4; id = "chapelgun"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/airlock_sensor{pixel_y = 25},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/chapel/main) @@ -7434,7 +7434,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaT aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaaaaaboJbnubntbnvbgrbnxboWbpmbnTaWMaVrbjpbpsblabnYbnZbmWbbZbbZbbZbbZbbZbbZboabobbocaXebdObdPbdPbdPbdPbdPbdPbdPbnybdPbdPbdPbogbdPbfmbnzblCbgabgabgabnAblpbkEaRYbnBbmGbombnCbncbnDbvGbotbnEbotaafbebbylbtAbowboxboybzibFKbebaafbedbkLboCbFMbpGbiCbiGboFaJibnHbnGaLYbXHbnLbnKbnObnNbnQaYebnSbnRbnUbnUbnWbnVbnXbnXbojbofboXbokbonbolboobnnboqbopbosbmPbnabovbmPbnabYfaVJbpjbozboGboBbplboEbppboHboKboIboMboLboOboNblOaZzboPbpxblOboQboSboRboUboTboVbnIbqUbpLbpJbnMaaaaaaaaaaacaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaabgnbgobgpbgqbdWbpObpObpObrsbpObrCboZboYbpabgrbpbbjpbauaYPbnFbpRbqHbqGbqKbqKbqKbqMbkWbpUbkWbkWbkWbkWbpVbpWbpWbpWbbxbdPbpebpdbpcbpfbpibphbpnbpkbqhbpqbptbqkbqkcKDbpubgabgabpwbfmaMbbpzbpybpAaJubqqbpBbpDbpCborbrobpIbotaafbebbebbpKbebbrubebbpMbebbebaafbedbqzboCbqAbrvbqCbqDbpNaJibpPaQSaLYaJibpSbpQbpZbpTbpgbqLbnSbqbbnXbnXbnXbnXbnXbnXbqdbqcbqebokbqgbqfbqibnnbqmbqjbqobqnbnabovbmPbqpbYfaVJbpjbqrboEbqtbqZbqsbqvbqubqubqubqEbqxbqIbqFbrhbqJbqObqNbnIbqPbqRbqQbqSboTbqTbnIbqXbqVbrrbnMaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaabsybsibrqbeMbdybgwbgwbhtbhobrcbgrbtkbsqcrMbhvbjpbjpbjpbajbrEbrFbrGbrHbrGbrGbrGbrHbrGbajbajbdPbdPbdPbsxbdPbgNbrdbrdbrdbrdbrdbpnbrfbrLbribrkbqabrmbrlbrpbrnbrtbrtbrxbrwbrzbrybrAaHBbsbbrBbsabrDbsAbotbrIbotaafbtDbsEbsBbrjbsmbsHbsBbsIbtDaafbedbspbhFbspbedbedbedbtbaJibrKaQSaLYbXHbnLbnKbrNbrMbrObqLbrJbqbbrRbrQbrTbrSbrPbrUbqdbrVbnibrXbrZbrYbscbnnbsdbqjbosbmPbnabovbmPbnabYfaVJbpjboEboEboEbseboEbsNbsgbsjbshbslbskbsobsnbrhbssbsubstbnIbswbsCbszbsFbsDbrWbnIbsMbhwbtebnMaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaacaaaaaaaaaaaaaaaaaaaaabsybtFbtEbuvbsLbsPbsPbsQbsPbsPbgrbsSbsRboAaYPbjpaaaaaaaaaaafaafbtnbtnbtnbtnbtnbtnbtnaaaaaabtJbhIbsTbsWbiYbsYbsXbsXbsXbsXbsXbtabsZbtdbtcbtgbtfbtzbupbfmbfmbhxbfmbfmbtCbtibthbtjbmGbtHbmGbmGbmGbmGbmGbtlbmGaafbvbbuGbtLbtmbtNbtmbtLbuNbvcaafbspbtQbtRbtSbtobtpbspbhyaJlbtqbbabtraJibtsblUbtubttbtvbucbtxbtwbFNbtybtIbtBbtMbtKbtPbtObnibokbtUbtTbsGbnnbovbtXbtZbtWbuabuabubbnabYfaXqbpjbsfboEbqtbsebuebuzbufbuhbugbujbuibulbudbrhbumbuqbunbnIburbutbusbsFboTbuubnIbuwbpFbvFbnMaaaaaaaaaaaacHOaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaacaaaaaaaaaaaaaaaaaaaaabsybtFbtEbuvbsLbsPbsPbsQbsPbsPbgrbsSbsRboAaYPbjpaaaaaaaaaaafaafbtnbtnbtnbtnbtnbtnbtnaaaaaabtJbhIbsTbsWbiYbsYbsXbsXbsXbsXbsXbtabsZbtdbtcbtgbtfbtzbupbfmbfmbhxbfmbfmbtCbtibthbtjbmGbtHbmGbmGbmGbmGbmGbtlbmGaafbvbbuGbtLbtmbtNbtmbtLbuNbvcaafbspbtQbtRbtSbtobtpbspbhyaJlbtqbbabtraJibtsblUbtubttbtvbucbtxbtwbFNbtybtIbtBbtMbtKbtPbtObnibnnbtUbtTbsGbnnbovbtXbtZbtWbuabuabubbnabYfaXqbpjbsfboEbqtbsebuebuzbufbuhbugbujbuibulbudbrhbumbuqbunbnIburbutbusbsFboTbuubnIbuwbpFbvFbnMaaaaaaaaaaaacHOaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeObyebvYbvZbpObwEbgnbgobwMbwEbgrbuybjpbwObwNbjpaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaabxIbkwbrdbuCbuBbuEbuDbuDbuDbuHbuFbuDbuIbuKbuJbuMbuLbuPbuObfmbuQbgabuSbuTbvsbuVbuUbukbmGbmGbmGbuYbuXbvabuZbvdbvwaafbydbwnbvHbvfbvebvgbvNbwxbydaafbspbwCbvQbxnbedbvhbspbhPaJlbuWbcvbvjaJibvVbvWbvXbwDbvkbucbvmbvlbvobvnbvpbvpbvrbvqbvubvtbvvbwkbvxbwmbwkbwkbwkbwkbvybwkbwkaXKaXKaXKaXKaVJbpjboEboEboEbtYbvzbwqbvBbsjbsjbsjbskbvDbvCbwvbwwbvEbwybnIbvIbvKbvJbvLboTbvMbnIbzDbwFbnMbnMaaaaaaaaaaaaaafbvObvRbuRbvRbuRbvRbvTaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbyAbyPbyFbvUbvUbwdbwcbwfbwebwebwebwgbrfbrdbrdbrLbwhbwjbwibwobwlbwrbwpbgabgabwsbxcbuVbuUbwzbwtbwBbwAbwGbxibxjbxkbwKbvwaafbxrbwPbtLbtmbwQbvibxobwSbxraafbspbqwbwRbwUbedbwVbspbhyaJlbwWbcvaLYaJibwYbwXbxabwZbxbbxCbxebxdbxCbxFbxGbxfbxFbwkbxhbxgbwkbwkbxmbkzbxqbxpbwTbxsbxvblubxwaXKbaybxxaXKbxybpjbvAboEbqtbxzbxAbppbxDbsjbsjbsjbskbvDbxEbrhbxHbxKbxJbnIbxLbxNbxMbxOboTbxPbnIbAVbykbnMaaaaaaaaaaaaaaaaafbxQbwHbrgbzNbwJbzObxQaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbzKbxRbzKbxSbxSbxTbwcbwfbrdbrdbxUbxWbrfbxXbdPbdPbxYbgabrkbwobxZbywbyabybbybbyfbycbyhbygbyibvsbyjbvPbHJbxkbyHbyIbymbvwaafbxrbxrbxrbxrbyobxrbxrbxrbxraafbyNbyNbyNbyNbyNbyNbyNbypaJibyqbeTbeVaJibxtbyrbyrbytbyubxCbyxbyvbyWbyybyBbyzbyCbwmbyEbyDbyJbyGbyLbyKbyKbyMbyObyKbyRbyQbySbaAbwubyTbAsbyUbyXbxBbyYbyVbyZbzabppbzcboIboIbzdbskbvDbzebppbzfbzhbzgbHmbHlbHobHnbHqbHpbnIbnIbBdbnMbnMbBobBpbBpbBpbBrbCJbzjbzkbrgbwJbrgbynbuRaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 14f373983fb5da82247ddd273b6c051a6cb2cf44 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Thu, 7 Jan 2016 12:23:04 +0100 Subject: [PATCH 17/28] Also makes the economic species modifier more general. --- code/game/jobs/job/job.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 67873874a27..cf7b1bbd94a 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -54,7 +54,7 @@ //give them an account in the station database var/species_modifier = (H.species ? economic_species_modifier[H.species.type] : 2) - if(species_modifier == 0) + if(!species_modifier) species_modifier = economic_species_modifier[/datum/species/human] var/money_amount = (rand(5,50) + rand(5, 50)) * loyalty * economic_modifier * species_modifier From cbcd5ab03530c5e0c2674458213933874f2f4622 Mon Sep 17 00:00:00 2001 From: Atlantis Date: Thu, 7 Jan 2016 12:24:00 +0100 Subject: [PATCH 18/28] Map fixes - Dev Edition - See #11658 - this is just edition for Dev - TLDR version: Fixes power alarm at construction site, fixes emitter button giving errors about not being connected to cable, unanchors emitters at mining outpost by default. - Added subtype for inactive APCs as per PsiOmegaDelta's request - Fixed gridcheck affecting telecommunications central compartment. --- code/modules/power/apc.dm | 10 ++++++++++ maps/exodus-3.dmm | 2 +- maps/exodus-4.dmm | 8 ++++---- maps/exodus-5.dmm | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 79cddcf10cb..f2c11b3704d 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -43,6 +43,16 @@ /obj/machinery/power/apc/high cell_type = /obj/item/weapon/cell/high +// Construction site APC, starts turned off +/obj/machinery/power/apc/high/inactive + cell_type = /obj/item/weapon/cell/high + lighting = 0 + equipment = 0 + environ = 0 + locked = 0 + coverlocked = 0 + start_charge = 100 + /obj/machinery/power/apc/super cell_type = /obj/item/weapon/cell/super diff --git a/maps/exodus-3.dmm b/maps/exodus-3.dmm index f041d5a290f..b3c38512501 100644 --- a/maps/exodus-3.dmm +++ b/maps/exodus-3.dmm @@ -212,7 +212,7 @@ "ed" = (/obj/machinery/door/airlock/hatch{name = "Telecoms Lounge"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/tcommsat/computer) "ee" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/space,/area/turret_protected/tcomsat) "ef" = (/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"eg" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"eg" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc/super/critical{name = "north bump"; pixel_y = 24},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "eh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 6},/turf/simulated/floor/plating,/area/tcommsat/chamber) "ei" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "ej" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/camera/network/telecom{c_tag = "Telecoms West Wing Central"; dir = 8},/turf/space,/area/turret_protected/tcomsat) diff --git a/maps/exodus-4.dmm b/maps/exodus-4.dmm index fbf2d3c7ce3..a16652b6190 100644 --- a/maps/exodus-4.dmm +++ b/maps/exodus-4.dmm @@ -70,7 +70,7 @@ "br" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/autolathe,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) "bs" = (/obj/machinery/atmospherics/pipe/simple/hidden/blue{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) "bt" = (/obj/structure/window/basic,/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/machinery/atmospherics/portables_connector{tag = "icon-map_connector (EAST)"; icon_state = "map_connector"; dir = 4},/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) -"bu" = (/obj/structure/cable/blue,/obj/machinery/power/apc/high{dir = 2; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "south bump"; pixel_y = -24},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) +"bu" = (/obj/structure/cable/blue,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/power/apc/high/inactive{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) "bv" = (/obj/machinery/pipedispenser/disposal,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) "bw" = (/obj/machinery/pipedispenser,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) "bx" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/constructionsite/teleporter) @@ -87,7 +87,7 @@ "bI" = (/obj/machinery/door/airlock/highsecurity{icon_state = "door_closed"; locked = 0; name = "AI Upload"; req_access = list(16)},/turf/simulated/floor/bluegrid/airless,/area/constructionsite/ai) "bJ" = (/obj/machinery/drone_fabricator/derelict,/turf/simulated/floor/airless,/area/constructionsite/ai) "bK" = (/obj/machinery/computer/drone_control,/turf/simulated/floor/airless,/area/constructionsite/ai) -"bL" = (/obj/machinery/power/apc/high{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/constructionsite/ai) +"bL" = (/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc/high/inactive{name = "north bump"; pixel_y = 24},/turf/simulated/floor/airless,/area/constructionsite/ai) "bM" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(30)},/turf/simulated/floor/airless,/area/constructionsite/hallway/fore) "bN" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(30)},/turf/simulated/floor/airless,/area/constructionsite/ai) "bO" = (/obj/machinery/door/airlock/highsecurity{name = "Cyborg Station"; req_access = list(16)},/turf/simulated/floor/bluegrid/airless,/area/constructionsite/ai) @@ -101,7 +101,7 @@ "bW" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/airless,/area/constructionsite/hallway/aft) "bX" = (/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/constructionsite/atmospherics) "bY" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/constructionsite/atmospherics) -"bZ" = (/obj/machinery/power/apc/high{dir = 2; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "south bump"; pixel_y = -24},/obj/structure/cable/blue,/turf/simulated/floor/airless,/area/constructionsite/atmospherics) +"bZ" = (/obj/structure/cable/blue,/obj/machinery/power/apc/high/inactive{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/airless,/area/constructionsite/atmospherics) "ca" = (/turf/simulated/floor/tiled/white/airless,/area/constructionsite/medical) "cb" = (/obj/structure/grille,/turf/simulated/floor/airless,/area/constructionsite/medical) "cc" = (/obj/machinery/sleeper,/turf/simulated/floor/tiled/white/airless,/area/constructionsite/medical) @@ -146,7 +146,7 @@ "cP" = (/obj/structure/cable/blue,/turf/simulated/floor/airless,/area/constructionsite/engineering) "cQ" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/turf/simulated/floor/airless,/area/space) "cR" = (/obj/machinery/field_generator,/turf/simulated/floor/airless,/area/space) -"cS" = (/obj/machinery/power/emitter{anchored = 1; dir = 8; id = "EngineEmitter"; state = 2},/turf/simulated/floor/airless,/area/space) +"cS" = (/obj/machinery/power/emitter{anchored = 1; dir = 8; state = 2},/turf/simulated/floor/airless,/area/space) "cV" = (/turf/simulated/wall,/area/constructionsite/hallway/aft) "cW" = (/turf/simulated/floor/airless,/area/constructionsite/hallway/aft) "dm" = (/obj/structure/lattice,/turf/space,/area/constructionsite/hallway/aft) diff --git a/maps/exodus-5.dmm b/maps/exodus-5.dmm index aadec2bad53..6bc897bab06 100644 --- a/maps/exodus-5.dmm +++ b/maps/exodus-5.dmm @@ -1053,7 +1053,7 @@ "um" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/outpost/engineering/atmospherics) "un" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor,/area/outpost/engineering/hallway) "uo" = (/obj/machinery/light/small{dir = 4},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "edock_sensor"; pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "edock_pump"},/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"up" = (/obj/machinery/power/emitter{anchored = 1; dir = 4; state = 2},/turf/simulated/floor/airless{icon_state = "asteroidplating"},/area/mine/explored) +"up" = (/obj/machinery/power/emitter{anchored = 0; dir = 4; state = 0},/turf/simulated/floor/airless{icon_state = "asteroidplating"},/area/mine/explored) "uq" = (/turf/simulated/wall,/area/outpost/engineering/hallway) "ur" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) "us" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_main_inner"; locked = 1; name = "Engineering Outpost"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/outpost/engineering/hallway) From fcc83892035d187465dce4cec1a6a650a7d20bc9 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Thu, 7 Jan 2016 16:00:24 +0100 Subject: [PATCH 19/28] Floor construction now checks stack subtypes. Fixes #11930. Also makes the robot fabricator use proper paths because I found it while searching for build type. --- code/game/machinery/robot_fabricator.dm | 18 +++++++++--------- code/game/turfs/simulated/floor_attackby.dm | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm index 4c44bcd4eeb..0ae1d2ceea1 100644 --- a/code/game/machinery/robot_fabricator.dm +++ b/code/game/machinery/robot_fabricator.dm @@ -71,47 +71,47 @@ Please wait until completion...
if (!src.operating) var/part_type = text2num(href_list["make"]) - var/build_type = "" + var/build_type = null var/build_time = 200 var/build_cost = 25000 switch (part_type) if (1) - build_type = "/obj/item/robot_parts/l_arm" + build_type = /obj/item/robot_parts/l_arm build_time = 200 build_cost = 25000 if (2) - build_type = "/obj/item/robot_parts/r_arm" + build_type = /obj/item/robot_parts/r_arm build_time = 200 build_cost = 25000 if (3) - build_type = "/obj/item/robot_parts/l_leg" + build_type = /obj/item/robot_parts/l_leg build_time = 200 build_cost = 25000 if (4) - build_type = "/obj/item/robot_parts/r_leg" + build_type = /obj/item/robot_parts/r_leg build_time = 200 build_cost = 25000 if (5) - build_type = "/obj/item/robot_parts/chest" + build_type = /obj/item/robot_parts/chest build_time = 350 build_cost = 50000 if (6) - build_type = "/obj/item/robot_parts/head" + build_type = /obj/item/robot_parts/head build_time = 350 build_cost = 50000 if (7) - build_type = "/obj/item/robot_parts/robot_suit" + build_type = /obj/item/robot_parts/robot_suit build_time = 600 build_cost = 75000 - var/building = text2path(build_type) + var/building = build_type if (!isnull(building)) if (src.metal_amount >= build_cost) src.operating = 1 diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm index c8cc2660c97..118f2277695 100644 --- a/code/game/turfs/simulated/floor_attackby.dm +++ b/code/game/turfs/simulated/floor_attackby.dm @@ -57,13 +57,13 @@ var/decl/flooring/F = flooring_types[flooring_type] if(!F.build_type) continue - if((S.type == F.build_type) || (S.build_type == F.build_type)) + if(ispath(S.type, F.build_type) || ispath(S.build_type, F.build_type)) use_flooring = F break if(!use_flooring) return // Do we have enough? - if(use_flooring.build_cost && S.amount < use_flooring.build_cost) + if(use_flooring.build_cost && S.get_amount() < use_flooring.build_cost) user << "You require at least [use_flooring.build_cost] [S.name] to complete the [use_flooring.descriptor]." return // Stay still and focus... From 7b4289e07234883125bb1fd21cd4bfbe23f5bd01 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 7 Jan 2016 19:40:50 +0300 Subject: [PATCH 20/28] Macro for intent --- code/modules/mob/living/carbon/human/human.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ea64a798aa7..58dd22d2223 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1385,7 +1385,7 @@ /mob/living/carbon/human/MouseDrop(var/atom/over_object) var/mob/living/carbon/human/H = over_object - if(H.a_intent == "help" && holder_type && istype(H) && !H.lying && !issmall(H) && Adjacent(H)) + if(H.a_intent == I_HELP && holder_type && istype(H) && !H.lying && !issmall(H) && Adjacent(H)) get_scooped(H, (usr == src)) return return ..() From 84718134064a72af5c621fa2b9225f3ab3281bf4 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 7 Jan 2016 21:17:31 +0300 Subject: [PATCH 21/28] Adds a handheld mirror that can change hairstyles. --- code/game/objects/structures/mirror.dm | 19 ++++++++++++++++++- code/modules/client/preferences_gear.dm | 6 ++++++ icons/obj/items.dmi | Bin 63219 -> 63473 bytes 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index aced90f9bb6..52fb76eb4ca 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -30,7 +30,7 @@ /obj/structure/mirror/bullet_act(var/obj/item/projectile/Proj) - + if(prob(Proj.get_structure_damage() * 2)) if(!shattered) shatter() @@ -91,3 +91,20 @@ raiders.update_access(vox) qdel(user) ..() + +/obj/item/weapon/mirror + name = "mirror" + desc = "A SalonPro Nano-Mirror(TM) brand mirror! Now a portable version." + icon = 'icons/obj/items.dmi' + icon_state = "mirror" + var/list/ui_users = list() + +/obj/item/weapon/mirror/attack_self(mob/user as mob) + if(ishuman(user)) + var/datum/nano_module/appearance_changer/AC = ui_users[user] + if(!AC) + AC = new(src, user) + AC.name = "SalonPro Nano-Mirror™" + AC.flags = APPEARANCE_HAIR + ui_users[user] = AC + AC.ui_interact(user) \ No newline at end of file diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 40cd37094dd..dfc26cb7c6a 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -1233,6 +1233,12 @@ var/global/list/gear_datums = list() sort_category = "misc" cost = 1 +/datum/gear/mirror + display_name = "handheld mirror" + path = /obj/item/weapon/mirror + sort_category = "misc" + cost = 1 + /datum/gear/zippo display_name = "zippo" path = /obj/item/weapon/flame/lighter/zippo diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 6631ebe296d39b3306e0f6b6ae865622f71b7204..bd6bdba66355bd47836f6c5eef563777eb10a154 100644 GIT binary patch delta 5900 zcmZ{nc|4Tg`~UB;D~v6K5JQR#BD=9OAzL97CA45<$?hIYA#eMZ$Xa$0l`xDVYa(0r zC1l?XX3X-P-k;CspWoy0yZ^Y?bFOop>s;scyzc!?+TCs1Bp44g=!UJYo{NvO_d_q= zhbT_~2*`Q+Dp^$y6wktQ&}gHHOn*G~m!q+WFwYr~@HuQQO<&h%7IU)X+N}CQih8@@ zzdq7B2z4Qg@m`vmQbGl-_GIIFkUf2&K23N0VhwUZ5HhVZ%vN}K^HQc>!SYLGpHj5| z6K>NtU1cv+5BFME51@MXR>c_=wr&?2w3`=v>*(Gw-UK^VE^-@Z)%y))`i6RE`o;|= z3vL;~>YL>|NkL0vLuC!9t*idoO~M_b1tA9O;qIwI$}cm*Z<>vc>`Nv^!QJC%RQz4n zeJq(>^io<(t>%pm&BYl{{kVSHMyWgPTA}UHp1>_A=5^x_LB@+X`5s!I(3wCdnW{Xk z;8&6dBH7^QmL2NzlWRXC4NlqxWe?hC);SK+VIL%?Bs3y4ZC^a2i(-t=zbR`Q>B=HF z9xD#*IOSlyJ}(;W_2nRXVQ&qvFvNwe;U}-a3G%IVjNh?`}=HF=FycV z`_`GuPAC+Q%KNT37ti6xd4t&c2iW{q9|ot7N^ zbIA_vb*r5FHX;>q0aqJDRK~<3n?T_8q$}=i4V5 zt&f@srqYSJ;!1W#>yv>uckwa$!rj~sGW=Sm4d*U? zEVY|eEwE@CQM6;V^Bx|YQUcwd!at4)+Tm6}8nf64lZ8U9g7cgdU}NlxNrJ&C{W-ME zK=YA+WWxI4B^EZZH9Jvy&>9u#`S7$PeyUkfzGA;*qCDzZ}_3F+IPA~T#3S(Yb zcTG6HOBcVxj?)L-x>P}8fQ+D5GoY>Es9l0Ybl;f_b zFj(OnZ!P1F1j5`)CYDj2jd(od3E{`3frhnK7tz&*hio116w+k)Et-1uU*7I&H6_GW zN7{3dZZ5^x5Si@b}2!9rGvO`HSipv{X` zF)QmA2_(7=`&$?PSb0SlJLSU>*OIWB!@Qn<)+%luFy;JHCsX4KOsH&_2qyJP;&}!N zo(x$2I>|7&exEyFINL&GUqd8?7xQ_79@^k`*kc{wAGo1T!c5R62Mv9EZHb=1#}+5E z%NxSAqRiw34X+q=tRGD5pY*(6sA7j1{s z?X08f*<0f`Jp8ysORV#j{l`<;P9olS+jmk#U|F)V>`qKD z*y@S%V5-|4`5}!VcvjYS$))tI++4gm$z%}gc(gwl8e05=Hs8yco&3}vy!CZpper_T zN?AapR}y=|gPBbUz?S?>La}J2blerZ&vFVGFT(SfkYHKa))cJ$HGaVOUC!cL>xMOyA*)<`uF(tAG4>j2otmjB| zZhn`_@&;1##u!xVcdPO>0WFz-T1XcO+ld2QmMHMUg3UxO1QbSZj(IjZauNXBc}9Ra zTY8rgGA4Bu@^XzAV{i^s(22x;o_-+o{j_j6Y|pXtU2Cz=35e~gf_{%7G}ecK0i9Z` zk_)8po&0xnVY>;fGa6(y*0NVjdiU_lx`XAx=PU5dV(^x%vjm}6(W9gj08la(n_a#c z2wUZt4YQ>nj=+}qV3LYgExT4;)8B`}& z8+Eb>zPTU_2HVcu4(12Eu6Ubn(pMep)}LL93m_u!u@0)3mUELsgHYgY23|O$-dXM1 zGmm1zGc2Mg5y9`8aANbo>quKDrL7nukUPP!kZVKqk=F5peLQD|Y0vdAcw%Rm>h?>4o&2MFBxtMq^DOv=1)rpA@ z#0=zOTZztFVFGlz#tQ4}ZNMQea!_!vAG~erQ^jBry;3J16H~~9tH}~(o!V|?8x7XAozutn-yeg2~p17pyuPl1C{RNyQzu72qBxZ z%;%j`XJ+o`(lqfr72uv486@l9`*NGL_s((r!54yK_dc(Bf-uw!UopiI6UBKPkHIZH8>EW~jC%r&$PXZQfPDQZH)gkN9LO zoi80%MEjkMC|ZDQ71%aqmd?YLZf``dq8E2p5zc4MMy9A_DE81qF|Rz0O}=4A&MC|AH|;X zToxh{#jXPmvP%Hes}cWKIyBV?Qukk5=N~ftw?DGn4Fa@g)DALyJRw(-_Ztp|%n&5% z2~W5Vm}UEbF%0 zht7Sg%L~&PY5A{}JTM__=oO$N+_%2VS{|0KS8lEO*En?q`z4!nU?XHHa}Vbun-TG;OH)`G@ zwB}qN(@Fe6oeRl^LZ?rW4HLtPesdYsdT&lB0BKKo~Z5W?%_e0wv26Ij`K>bzYje-=#FbCZ-j4o)v4rW2xai&<7*pF)pD+1$Snl_E>lP1{C@wqai%m*YI&AvS<94c!G*4> zu<5Z;UnYHV6!L7zypiFU@pC{;C_P<_xsa0x4^SHkHDK!bLd&Ok?04tj_q%LQ$Q(4_ zddZcV4P4N|-k|V?aNlc0XgUrwRy3;>Y{dO9`MQOlGCHlVrSHAZ5Yy^S&fl!9`~gRD z%65kr7t@A&+}p8<^sWKpFJFi_^*Spnc52FDIMiB6S~tH=J1|gX%2TO*vVYgQ@e=m8 zP;p2>ci6Le@0V-U0*9y1>6lbe8XHCGS39diC~clY6tXSFxrj_(xfAE8JwYOccUE`q zM)%QrRW338xYNRY{PS9+-u&D6Q~>a&EIGzEnmP9}m%U$#Qg{T8irro8VqLjY+yl?h zU6wD^42xV7DHdir4HOe}r>%#v+MYMb=1S|c4xps#FYK3rJWX;9-5h3Hz83YGWm1`W zy#Bg@O~3w#4ds2n!v$E#)g?BdwIz~qf$}T;*{r-Th4ID`Z?iSN%1i2cq}f-C_k&eV zPQd7fE6F}O-4E0^A)dZ_4>!i>f+|k{+!jALz8|I->pXWC9tTWE-Z($v; zFM@~I$xQ>i&b+$~n^OVUbe0YuJuO+^TK)OiW--1uIuSe`yS#ha)3^ov;z2m-C)Br) zzb!;7&SGt&KAfD;CORfAK&K!pYil}ILy$!lR>%$`c=Xozr9xQ9!IMmm3|)%|O6Zjr z5D`~SSv$B9@E|PzY~KSmFqKP^P;N8=YIjEbFJY&JSLjMvCItlfnCK|X3m&f`v9*;o z+r7aP@O^_XG?KEjJ9qSzByvWZ8%HZ*{zrv~~{Z!A6K6OwIl5nN=Tr)aP$-KE-p zpl*#$y^zqZ$YJj4>iV6O_9Usu+9_w?zj}WO-zGt$s-hzNGAB_J2!9yteQqLyUX-39 z9V~>d9!Z1845<7u)ZOm+EB#dcC*RnQo`wvhhB|J2`>=Y&!rRQ=Xor#i2rOP@LmRyj zO4iJS&x5Nx|Ds~G1aX_l!G)$aHm!+i#R&g^hKy2sMMfZ!Y-s>Gn~1FR|M-C*mCZr3 zna!EU;4KG_@4JjAr@Q>Zs8fTY#VNNPz3&GlqbXMnt*v=#YimuaL;i!JRkNp{IZeLr z1Xtc-z3({ux80APTE-LrY>q@waj3&7Ho#odG>J%V?X4#I%zX>Ul#;3-u2l&G;)Xj)urG@>)?ONM^a0~vwy!|=F>}7oGVdO+8XidR8ROOld_3xhgtLG5U zi&7rPo`X@kDr|<|LoeiRNirO;Myzhl?vK{(btml09R-u?)lyx*iYL%e+5Xskny%(; z<%fdp>&xdAPp+#^Td1F`UbwMo4EkON8x3Zt-D<&!IVgatu1rc7*67iq77RG^bl}b7 zosSbBVMuXL$zvJ-K7K)P7p0&_q{B9LEP%<%V3 zHMSucNv&gGkXM{&&qPL`ob8j4{tUMo@Lz^1`PGOg`=KJhv{rn=@wln9rh=UKrb! z65HC|$489b-kfH>O)}Us6gxwV2P@Zem`B`p?v2go3Uqaq0KI*DENpC+XGLf?EveDN zU<5tu1vE4?!buCPjgLt3fD5A(Q8b7k#$mSeOF(WQngMiqO-*2L_V>*BRD=zWdFu=Y zja2X=mz4_AtQkQL29Ub6VaL*FJr0!a8wd-Tn)m!v#!ThjO$8h8BL~IrD;o+(b#CziKRp2SK^2P5_RXWbY4jb>tXh`(9!1OZ zL?C3TEvZQdm|IwczgF{SX!g80P95NZ*qS6dW;?+DzQqi8po+!dv~Z6t6Zw>x45)4S z?jU_`+q>adkXnKx zASQK6&w03FnGR`)Z|hbINTL}x}V>h!L|5>c{SN^0`%@<2dHWCmTh?@#RE_umE1*Ls h>D{HFO3UaDWj7PU&}5GL1yB#9{&l@~Iy6oZ{|A7}eeD1M delta 5644 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 u Date: Thu, 7 Jan 2016 21:18:29 +0300 Subject: [PATCH 22/28] Unrelatedly cleans up some dark ages-styled code. --- code/game/objects/items/weapons/cosmetics.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 218d2fb21cf..01ce9f87c8c 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -78,6 +78,4 @@ item_state = "purplecomb" /obj/item/weapon/haircomb/attack_self(mob/user) - if(user.r_hand == src || user.l_hand == src) - user.visible_message(text("[] uses [] to comb their hair with incredible style and sophistication. What a [].", user, src, user.gender == FEMALE ? "lady" : "guy")) - return + user.visible_message("[user] uses [src] to comb their hair with incredible style and sophistication. What a [user.gender == FEMALE ? "lady" : "guy"].") \ No newline at end of file From 77ecaac36b83a464736dc7daf4c0a7138cea5d6f Mon Sep 17 00:00:00 2001 From: Techhead0 Date: Thu, 7 Jan 2016 15:54:51 -0500 Subject: [PATCH 23/28] Quick fix for #11772 Changes character setup to use species' bodytypes to determine hairstyle availability. --- .../modules/client/preference_setup/general/03_body.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index e236c523890..680e6221523 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -180,7 +180,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O return mob_species && (mob_species.appearance_flags & flag) /datum/category_item/player_setup_item/general/body/OnTopic(var/href,var/list/href_list, var/mob/user) - var/mob_species = all_species[pref.species] + var/datum/species/mob_species = all_species[pref.species] if(href_list["random"]) pref.randomize_appearance_for() @@ -217,7 +217,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(pref.gender == FEMALE && S.gender == MALE) continue - if(!(pref.species in S.species_allowed)) + if(!(mob_species.get_bodytype() in S.species_allowed)) continue valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] @@ -235,7 +235,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(pref.gender == FEMALE && S.gender == MALE) continue - if(!(pref.species in S.species_allowed)) + if(!(mob_species.get_bodytype() in S.species_allowed)) continue valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] @@ -268,7 +268,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/list/valid_hairstyles = list() for(var/hairstyle in hair_styles_list) var/datum/sprite_accessory/S = hair_styles_list[hairstyle] - if(!(pref.species in S.species_allowed)) + if(!(mob_species.get_bodytype() in S.species_allowed)) continue valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] @@ -324,7 +324,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(pref.gender == FEMALE && S.gender == MALE) continue - if(!(pref.species in S.species_allowed)) + if(!(mob_species.get_bodytype() in S.species_allowed)) continue valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] From c3b3f6e546f4205db3a5fbe68801cae468810741 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 7 Jan 2016 21:27:05 +0300 Subject: [PATCH 24/28] Adds Destroy to both handheld and wall mirrors --- code/game/objects/structures/mirror.dm | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 52fb76eb4ca..261aa3266a8 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -64,6 +64,13 @@ user.visible_message("[user] hits [src] and bounces off!") return 1 +/obj/structure/mirror/Destroy() + for(var/user in ui_users) + var/datum/nano_module/appearance_changer/AC = ui_users[user] + qdel(AC) + ui_users.Cut() + ..() + // The following mirror is ~special~. /obj/structure/mirror/raider name = "cracked mirror" @@ -107,4 +114,11 @@ AC.name = "SalonPro Nano-Mirror™" AC.flags = APPEARANCE_HAIR ui_users[user] = AC - AC.ui_interact(user) \ No newline at end of file + AC.ui_interact(user) + +/obj/item/weapon/mirror/Destroy() + for(var/user in ui_users) + var/datum/nano_module/appearance_changer/AC = ui_users[user] + qdel(AC) + ui_users.Cut() + ..() \ No newline at end of file From 265c0d25678542bb9d223f548be318df547f9407 Mon Sep 17 00:00:00 2001 From: Atlantis Date: Fri, 8 Jan 2016 01:34:30 +0100 Subject: [PATCH 25/28] Modular Computer Multitasking + Fixes - Modular computers now support multitasking. - New hardware type added. Basic CPUs may be obtained when purchasing a laptop or tablet, Photonic CPUs can be printed at research at imprinter. This hardware piece determines how many programs can be on background. - Programs can now have an icon that is rendered in main UI's header (along with the power icons, etc.) when the program is on background. As an example, these icons have been added to NTNRC client (Dark icon when no messages have been received, blinking when new message is waiting), Alarm monitor (Blinking red when an alarm is active, green otherwise) and downloader program (Animated arrow when downloading, stationary when finished.) - Adds missing crew monitor icon to tablets. Fixes #11937 --- baystation12.dme | 1 + code/modules/alarm/alarm_handler.dm | 5 + .../computers/item/modular_computer.dm | 87 +++++++++++++++--- .../computers/item/processor.dm | 4 +- .../computers/machinery/console_presets.dm | 1 + .../computers/machinery/modular_computer.dm | 3 +- .../modular_computers/file_system/program.dm | 7 ++ .../file_system/programs/_engineering.dm | 25 ++++- .../file_system/programs/ntdownloader.dm | 5 + .../file_system/programs/ntnrc_client.dm | 17 ++++ .../hardware/processor_unit.dm | 36 ++++++++ .../modular_computers/laptop_vendor.dm | 22 ++++- code/modules/nano/modules/alarm_monitor.dm | 8 ++ code/modules/research/designs.dm | 39 ++++++++ icons/obj/modular_components.dmi | Bin 2639 -> 3291 bytes icons/obj/modular_console.dmi | Bin 25404 -> 26093 bytes icons/obj/modular_laptop.dmi | Bin 25642 -> 25753 bytes icons/obj/modular_tablet.dmi | Bin 1449 -> 1467 bytes nano/images/status_icons/alarm_green.gif | Bin 0 -> 107 bytes nano/images/status_icons/alarm_red.gif | Bin 0 -> 163 bytes .../status_icons/downloader_finished.gif | Bin 0 -> 130 bytes .../status_icons/downloader_running.gif | Bin 0 -> 574 bytes nano/images/status_icons/ntnrc_idle.gif | Bin 0 -> 113 bytes nano/images/status_icons/ntnrc_new.gif | Bin 0 -> 181 bytes nano/templates/computer_fabricator.tmpl | 5 + nano/templates/layout_default.tmpl | 4 + 26 files changed, 247 insertions(+), 22 deletions(-) create mode 100644 code/modules/modular_computers/hardware/processor_unit.dm create mode 100644 nano/images/status_icons/alarm_green.gif create mode 100644 nano/images/status_icons/alarm_red.gif create mode 100644 nano/images/status_icons/downloader_finished.gif create mode 100644 nano/images/status_icons/downloader_running.gif create mode 100644 nano/images/status_icons/ntnrc_idle.gif create mode 100644 nano/images/status_icons/ntnrc_new.gif diff --git a/baystation12.dme b/baystation12.dme index 8afada0ac4c..cda15ea108a 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1470,6 +1470,7 @@ #include "code\modules\modular_computers\hardware\nano_printer.dm" #include "code\modules\modular_computers\hardware\network_card.dm" #include "code\modules\modular_computers\hardware\portable_hard_drive.dm" +#include "code\modules\modular_computers\hardware\processor_unit.dm" #include "code\modules\modular_computers\hardware\tesla_link.dm" #include "code\modules\modular_computers\NTNet\NTNet.dm" #include "code\modules\modular_computers\NTNet\NTNet_relay.dm" diff --git a/code/modules/alarm/alarm_handler.dm b/code/modules/alarm/alarm_handler.dm index afa45d7649c..9cf52add77b 100644 --- a/code/modules/alarm/alarm_handler.dm +++ b/code/modules/alarm/alarm_handler.dm @@ -50,6 +50,11 @@ /datum/alarm_handler/proc/major_alarms() return alarms +/datum/alarm_handler/proc/has_major_alarms() + if(alarms && alarms.len) + return 1 + return 0 + /datum/alarm_handler/proc/minor_alarms() return alarms diff --git a/code/modules/modular_computers/computers/item/modular_computer.dm b/code/modules/modular_computers/computers/item/modular_computer.dm index dd53adcdc80..847fc99b52e 100644 --- a/code/modules/modular_computers/computers/item/modular_computer.dm +++ b/code/modules/modular_computers/computers/item/modular_computer.dm @@ -28,6 +28,7 @@ // Important hardware (must be installed for computer to work) + var/obj/item/weapon/computer_hardware/processor_unit/processor_unit // CPU. Without it the computer won't run. Better CPUs can run more programs at once. var/obj/item/weapon/computer_hardware/network_card/network_card // Network Card component of this computer. Allows connection to NTNet var/obj/item/weapon/computer_hardware/hard_drive/hard_drive // Hard Drive component of this computer. Stores programs and files. var/obj/item/weapon/computer_hardware/battery_module/battery_module // An internal power source for this computer. Can be recharged. @@ -36,6 +37,8 @@ var/obj/item/weapon/computer_hardware/nano_printer/nano_printer // Nano Printer component of this computer, for your everyday paperwork needs. var/obj/item/weapon/computer_hardware/hard_drive/portable/portable_drive // Portable data storage + var/list/idle_threads = list() // Idle programs on background. They still receive process calls but can't be interacted with. + // Eject ID card from computer, if it has ID slot with card inside. /obj/item/modular_computer/verb/eject_id() @@ -164,7 +167,7 @@ /obj/item/modular_computer/proc/turn_on(var/mob/user) var/issynth = issilicon(user) // Robots and AIs get different activation messages. - if((battery_module && battery_module.battery.charge) || check_power_override()) // Battery-run and charged or non-battery but powered by APC. + if(processor_unit && ((battery_module && battery_module.battery.charge) || check_power_override())) // Battery-run and charged or non-battery but powered by APC. if(issynth) user << "You send an activation signal to \the [src], turning it on" else @@ -188,11 +191,22 @@ kill_program(1) visible_message("\The [src]'s screen briefly freezes and then shows \"NETWORK ERROR - NTNet connection lost. Please retry. If problem persists contact your system administrator.\" error.") + for(var/datum/computer_file/program/P in idle_threads) + if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature)) + P.kill_program(1) + idle_threads.Remove(P) + visible_message("\The [src] screen displays an \"Process [P.filename].[P.filetype] (PID [rand(100,999)]) terminated - Network Error\" error") + if(active_program) active_program.process_tick() active_program.ntnet_status = get_ntnet_status() active_program.computer_emagged = computer_emagged + for(var/datum/computer_file/program/P in idle_threads) + P.process_tick() + P.ntnet_status = get_ntnet_status() + P.computer_emagged = computer_emagged + handle_power() // Handles all computer power interaction // Function used by NanoUI's to obtain data for header. All relevant entries begin with "PC_" @@ -230,6 +244,17 @@ if(3) data["PC_ntneticon"] = "sig_lan.gif" + if(idle_threads.len) + var/list/program_headers = list() + for(var/datum/computer_file/program/P in idle_threads) + if(!P.ui_header) + continue + program_headers.Add(list(list( + "icon" = P.ui_header + ))) + + data["PC_programheaders"] = program_headers + data["PC_stationtime"] = worldtime2text() data["PC_hasheader"] = 1 data["PC_showexitprogram"] = active_program ? 1 : 0 // Hides "Exit Program" button on mainscreen @@ -257,9 +282,13 @@ return 0 return ntnet_global.add_log(text, network_card) -/obj/item/modular_computer/proc/shutdown_computer() +/obj/item/modular_computer/proc/shutdown_computer(var/loud = 1) kill_program(1) - visible_message("\The [src] shuts down.") + for(var/datum/computer_file/program/P in idle_threads) + P.kill_program(1) + idle_threads.Remove(P) + if(loud) + visible_message("\The [src] shuts down.") enabled = 0 update_icon() return @@ -284,6 +313,23 @@ if( href_list["PC_shutdown"] ) shutdown_computer() return + if( href_list["PC_minimize"] ) + var/mob/user = usr + if(!active_program || !processor_unit) + return + + if(idle_threads.len >= processor_unit.max_idle_programs) + user << "\The [src] displays a \"Maximal CPU load reached. Unable to minimize another program.\" error" + return + + idle_threads.Add(active_program) + active_program.running = 0 // Should close any existing UIs + nanomanager.close_uis(active_program.NM ? active_program.NM : active_program) + active_program = null + update_icon() + if(user && istype(user)) + ui_interact(user) // Re-open the UI on this computer. It should show the main screen now. + if( href_list["PC_runprogram"] ) var/prog = href_list["PC_runprogram"] var/datum/computer_file/program/P = null @@ -299,6 +345,14 @@ if(!P.is_supported_by_hardware(hardware_flag, 1, user)) return + // The program is already running. Resume it. + if(P in idle_threads) + P.running = 1 + active_program = P + idle_threads.Remove(P) + update_icon() + return + if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature)) // The program requires NTNet connection, but we are not connected to NTNet. user << "\The [src]'s screen shows \"NETWORK ERROR - Unable to connect to NTNet. Please retry. If problem persists contact your system administrator.\" warning." return @@ -311,9 +365,7 @@ /obj/item/modular_computer/proc/power_failure() if(enabled) // Shut down the computer visible_message("\The [src]'s screen flickers \"BATTERY CRITICAL\" warning as it shuts down unexpectedly.") - kill_program(1) - enabled = 0 - update_icon() + shutdown_computer(0) // Handles power-related things, such as battery interaction, recharging, shutdown when it's discharged /obj/item/modular_computer/proc/handle_power() @@ -322,11 +374,10 @@ return 0 var/power_usage = screen_on ? base_active_power_usage : base_idle_power_usage - if(network_card && network_card.enabled) - power_usage += network_card.power_usage - if(hard_drive && hard_drive.enabled) - power_usage += hard_drive.power_usage + for(var/obj/item/weapon/computer_hardware/H in get_all_components()) + if(H.enabled) + power_usage += H.power_usage if(battery_module) battery_module.battery.use(power_usage * CELLRATE) @@ -440,6 +491,12 @@ return found = 1 battery_module = H + else if(istype(H, /obj/item/weapon/computer_hardware/processor_unit)) + if(processor_unit) + user << "This computer's processor slot is already occupied by \the [processor_unit]." + return + found = 1 + processor_unit = H if(found) user << "You install \the [H] into \the [src]" H.holder2 = src @@ -467,11 +524,15 @@ if(battery_module == H) battery_module = null found = 1 + if(processor_unit == H) + processor_unit = null + found = 1 + critical = 1 if(found) user << "You remove \the [H] from \the [src]." H.forceMove(get_turf(src)) H.holder2 = null - if(critical) + if(critical && enabled) user << "\The [src]'s screen freezes for few seconds and then displays an \"HARDWARE ERROR: Critical component disconnected. Please verify component connection and reboot the device. If the problem persists contact technical support for assistance.\" warning." kill_program(1) enabled = 0 @@ -492,6 +553,8 @@ return card_slot if(battery_module && (battery_module.name == name)) return battery_module + if(processor_unit && (processor_unit.name == name)) + return processor_unit return null // Returns list of all components @@ -509,4 +572,6 @@ all_components.Add(card_slot) if(battery_module) all_components.Add(battery_module) + if(processor_unit) + all_components.Add(processor_unit) return all_components \ No newline at end of file diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm index 0e44e6ac99c..21818d06b15 100644 --- a/code/modules/modular_computers/computers/item/processor.dm +++ b/code/modules/modular_computers/computers/item/processor.dm @@ -78,9 +78,7 @@ /obj/item/modular_computer/processor/shutdown_computer() if(!machinery_computer) return - kill_program(1) - visible_message("\The [machinery_computer] shuts down.") - enabled = 0 + ..() machinery_computer.update_icon() return diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index a423fba92e7..9dafd2405c9 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -8,6 +8,7 @@ . = ..() if(!cpu) return + cpu.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit(cpu) if(_has_id_slot) cpu.card_slot = new/obj/item/weapon/computer_hardware/card_slot(cpu) if(_has_printer) diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index a4f2cdfa6f5..7377c32182e 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -81,8 +81,7 @@ if(cpu && cpu.enabled) // Shut down the computer visible_message("\The [src]'s screen flickers [cpu.battery_module ? "\"BATTERY CRITICAL\"" : "\"EXTERNAL POWER LOSS\""] warning as it shuts down unexpectedly.") if(cpu) - cpu.kill_program(1) - cpu.enabled = 0 + cpu.shutdown_computer(0) battery_powered = 0 update_icon() stat |= NOPOWER diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index b21a136b4e8..805f4258852 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -18,6 +18,8 @@ var/available_on_ntnet = 1 // Whether the program can be downloaded from NTNet. Set to 0 to disable. var/available_on_syndinet = 0 // Whether the program can be downloaded from SyndiNet (accessible via emagging the computer). Set to 1 to enable. var/computer_emagged = 0 // Set to 1 if computer that's running us was emagged. Computer updates this every Process() tick + var/ui_header = null // Example: "something.gif" - a header image that will be rendered in computer's UI when this program is running at background. Images are taken from /nano/images/status_icons. Be careful not to use too large images! + /datum/computer_file/program/New(var/obj/item/modular_computer/comp = null) ..() @@ -35,6 +37,11 @@ temp.usage_flags = usage_flags return temp +// Relays icon update to the computer. +/datum/computer_file/program/proc/update_computer_icon() + if(computer) + computer.update_icon() + // Attempts to create a log in global ntnet datum. Returns 1 on success, 0 on fail. /datum/computer_file/program/proc/generate_network_log(var/text) if(computer) diff --git a/code/modules/modular_computers/file_system/programs/_engineering.dm b/code/modules/modular_computers/file_system/programs/_engineering.dm index c038efdbb0b..db00a52d90f 100644 --- a/code/modules/modular_computers/file_system/programs/_engineering.dm +++ b/code/modules/modular_computers/file_system/programs/_engineering.dm @@ -15,18 +15,37 @@ filename = "alarmmonitor" filedesc = "Alarm Monitoring" nanomodule_path = /datum/nano_module/alarm_monitor/engineering - program_icon_state = "alarm_monitor" + ui_header = "alarm_green.gif" + program_icon_state = "alert-green" extended_desc = "This program provides visual interface for station's alarm system." requires_ntnet = 1 network_destination = "alarm monitoring network" size = 5 + var/has_alert = 0 + +/datum/computer_file/program/alarm_monitor/process_tick() + ..() + var/datum/nano_module/alarm_monitor/NMA = NM + if(istype(NMA) && NMA.has_major_alarms()) + if(!has_alert) + program_icon_state = "alert-red" + ui_header = "alarm_red.gif" + update_computer_icon() + has_alert = 1 + else + if(has_alert) + program_icon_state = "alert-green" + ui_header = "alarm_green.gif" + update_computer_icon() + has_alert = 0 + return 1 /datum/computer_file/program/atmos_control filename = "atmoscontrol" filedesc = "Atmosphere Control" nanomodule_path = /datum/nano_module/atmos_control program_icon_state = "atmos_control" - extended_desc = "This program allows remote control of air alarms around the station" + extended_desc = "This program allows remote control of air alarms around the station. This program can not be run on tablet computers." required_access = access_atmospherics requires_ntnet = 1 network_destination = "atmospheric control system" @@ -39,7 +58,7 @@ filedesc = "RCON Remote Control" nanomodule_path = /datum/nano_module/rcon program_icon_state = "generic" - extended_desc = "This program allows remote control of power distribution systems around the station." + extended_desc = "This program allows remote control of power distribution systems around the station. This program can not be run on tablet computers." required_access = access_engine requires_ntnet = 1 network_destination = "RCON remote control system" diff --git a/code/modules/modular_computers/file_system/programs/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/ntdownloader.dm index 1e22a703344..a6339cb637f 100644 --- a/code/modules/modular_computers/file_system/programs/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/ntdownloader.dm @@ -10,6 +10,7 @@ requires_ntnet_feature = NTNET_SOFTWAREDOWNLOAD available_on_ntnet = 0 nanomodule_path = /datum/nano_module/computer_ntnetdownload/ + ui_header = "downloader_finished.gif" var/datum/computer_file/program/downloaded_file = null var/hacked_download = 0 var/download_completion = 0 //GQ of downloaded data. @@ -32,6 +33,8 @@ if(!computer || !computer.hard_drive || !computer.hard_drive.try_store_file(PRG)) return 0 + ui_header = "downloader_running.gif" + if(PRG in ntnet_global.available_station_software) generate_network_log("Began downloading file [PRG.filename].[PRG.filetype] from NTNet Software Repository.") hacked_download = 0 @@ -50,6 +53,7 @@ generate_network_log("Aborted download of file [hacked_download ? "**ENCRYPTED**" : downloaded_file.filename].[downloaded_file.filetype].") downloaded_file = null download_completion = 0 + ui_header = "downloader_finished.gif" /datum/computer_file/program/ntnetdownload/proc/complete_file_download() if(!downloaded_file) @@ -60,6 +64,7 @@ downloaderror = "I/O ERROR - Unable to save file. Check whether you have enough free space on your hard drive and whether your hard drive is properly connected. If the issue persists contact your system administrator for assistance." downloaded_file = null download_completion = 0 + ui_header = "downloader_finished.gif" /datum/computer_file/program/ntnetdownload/process_tick() if(!downloaded_file) diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm index ab9a95aac55..9f7efb5449f 100644 --- a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -7,8 +7,10 @@ requires_ntnet = 1 requires_ntnet_feature = NTNET_COMMUNICATION network_destination = "NTNRC server" + ui_header = "ntnrc_idle.gif" available_on_ntnet = 1 nanomodule_path = /datum/nano_module/computer_chatclient/ + var/last_message = null // Used to generate the toolbar icon var/username var/datum/ntnet_conversation/channel = null var/operator_mode = 0 // Channel operator mode @@ -30,6 +32,7 @@ if(href_list["PRG_joinchannel"]) var/datum/ntnet_conversation/C for(var/datum/ntnet_conversation/chan in ntnet_global.chat_channels) + world << "DEBUG L35/NTNRC_CLIENT.DM: \"[href_list["PRG_joinchannel"]]\" / \"[chan.title]\"" if(chan.title == href_list["PRG_joinchannel"]) C = chan break @@ -143,6 +146,20 @@ ..(href, href_list) +/datum/computer_file/program/chatclient/process_tick() + ..() + if(running) + ui_header = "ntnrc_idle.gif" + if(channel) + // Remember the last message. If there is no message in the channel remember null. + last_message = channel.messages.len ? channel.messages[channel.messages.len - 1] : null + else + last_message = null + return 1 + if(channel && channel.messages && channel.messages.len) + ui_header = last_message == channel.messages[channel.messages.len - 1] ? "ntnrc_idle.gif" : "ntnrc_new.gif" + else + ui_header = "ntnrc_idle.gif" /datum/computer_file/program/chatclient/kill_program(var/forced = 0) if(channel) diff --git a/code/modules/modular_computers/hardware/processor_unit.dm b/code/modules/modular_computers/hardware/processor_unit.dm new file mode 100644 index 00000000000..b013a39cd9d --- /dev/null +++ b/code/modules/modular_computers/hardware/processor_unit.dm @@ -0,0 +1,36 @@ +// CPU that allows the computer to run programs. +// Better CPUs are obtainable via research and can run more programs on background. + +/obj/item/weapon/computer_hardware/processor_unit + name = "standard processor" + desc = "A standard CPU used in most computers. It can run up to three programs simultaneously." + icon_state = "cpu_normal" + hardware_size = 2 + power_usage = 50 + critical = 1 + + var/max_idle_programs = 2 // 2 idle, + 1 active = 3 as said in description. + +/obj/item/weapon/computer_hardware/processor_unit/small + name = "standard microprocessor" + desc = "A standard miniaturised CPU used in portable devices. It can run up to two programs simultaneously." + icon_state = "cpu_small" + hardware_size = 1 + power_usage = 25 + max_idle_programs = 1 + +/obj/item/weapon/computer_hardware/processor_unit/photonic + name = "photonic processor" + desc = "An advanced experimental CPU that uses photonic core instead of regular circuitry. It can run up to five programs simultaneously, but uses a lot of power." + icon_state = "cpu_normal_photonic" + hardware_size = 2 + power_usage = 250 + max_idle_programs = 4 + +/obj/item/weapon/computer_hardware/processor_unit/photonic/small + name = "photonic microprocessor" + desc = "An advanced miniaturised CPU for use in portable devices. It uses photonic core instead of regular circuitry. It can run up to three programs simultaneously." + icon_state = "cpu_small_photonic" + hardware_size = 1 + power_usage = 75 + max_idle_programs = 2 \ No newline at end of file diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index dce72afcb77..31e7fc8381d 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -19,6 +19,7 @@ var/total_price = 0 // Price of currently vended device. // Device loadout + var/dev_cpu = 1 // 1: Default, 2: Upgraded var/dev_battery = 1 // 1: Default, 2: Upgraded, 3: Advanced var/dev_disk = 1 // 1: Default, 2: Upgraded, 3: Advanced var/dev_netcard = 0 // 0: None, 1: Basic, 2: Long-Range @@ -36,6 +37,7 @@ if(fabricated_tablet) qdel(fabricated_tablet) fabricated_tablet = null + dev_cpu = 1 dev_battery = 1 dev_disk = 1 dev_netcard = 0 @@ -50,17 +52,25 @@ if(fabricate) fabricated_laptop = new(src) total_price = 99 + switch(dev_cpu) + if(1) + if(fabricate) + fabricated_laptop.cpu.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(fabricated_laptop.cpu) + if(2) + if(fabricate) + fabricated_laptop.cpu.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit(fabricated_laptop.cpu) + total_price += 299 switch(dev_battery) if(1) // Basic(750C) if(fabricate) - fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module(fabricated_tablet) + fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module(fabricated_laptop.cpu) if(2) // Upgraded(1100C) if(fabricate) - fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module/advanced(fabricated_tablet) + fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module/advanced(fabricated_laptop.cpu) total_price += 199 if(3) // Advanced(1500C) if(fabricate) - fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module/super(fabricated_tablet) + fabricated_laptop.cpu.battery_module = new/obj/item/weapon/computer_hardware/battery_module/super(fabricated_laptop.cpu) total_price += 499 switch(dev_disk) if(1) // Basic(128GQ) @@ -100,6 +110,7 @@ else if(devtype == 2) // Tablet, more expensive, not everyone could probably afford this. if(fabricate) fabricated_tablet = new(src) + fabricated_tablet.processor_unit = new/obj/item/weapon/computer_hardware/processor_unit/small(fabricated_tablet) total_price = 199 switch(dev_battery) if(1) // Basic(300C) @@ -169,6 +180,10 @@ state = 2 // Wait for ID swipe for payment processing fabricate_and_recalc_price(0) return 1 + if(href_list["hw_cpu"]) + dev_cpu = text2num(href_list["hw_cpu"]) + fabricate_and_recalc_price(0) + return 1 if(href_list["hw_battery"]) dev_battery = text2num(href_list["hw_battery"]) fabricate_and_recalc_price(0) @@ -213,6 +228,7 @@ data["hw_tesla"] = dev_tesla data["hw_nanoprint"] = dev_nanoprint data["hw_card"] = dev_card + data["hw_cpu"] = dev_cpu data["totalprice"] = "[total_price]$" ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) diff --git a/code/modules/nano/modules/alarm_monitor.dm b/code/modules/nano/modules/alarm_monitor.dm index 839b099d76f..41435c05342 100644 --- a/code/modules/nano/modules/alarm_monitor.dm +++ b/code/modules/nano/modules/alarm_monitor.dm @@ -41,6 +41,14 @@ return all_alarms +// Modified version of above proc that uses slightly less resources, returns 1 if there is a major alarm, 0 otherwise. +/datum/nano_module/alarm_monitor/proc/has_major_alarms() + for(var/datum/alarm_handler/AH in alarm_handlers) + if(AH.has_major_alarms()) + return 1 + + return 0 + /datum/nano_module/alarm_monitor/proc/minor_alarms() var/list/all_alarms = new() for(var/datum/alarm_handler/AH in alarm_handlers) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index ffb8fc310f4..a9a264ec48d 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -916,6 +916,45 @@ other types of metals and chemistry for reagents). build_path = /obj/item/weapon/computer_hardware/battery_module/micro sort_string = "VBAAU" +/datum/design/item/modularcomponent/cpu/ + name = "processor unit" + id = "cpu_normal" + req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2) + build_type = IMPRINTER + materials = list(DEFAULT_WALL_MATERIAL = 8000) + chemicals = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/processor_unit + sort_string = "VBAAV" + +/datum/design/item/modularcomponent/cpu/small + name = "microprocessor unit" + id = "cpu_small" + req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + build_type = IMPRINTER + materials = list(DEFAULT_WALL_MATERIAL = 4000) + chemicals = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/processor_unit/small + sort_string = "VBAAW" + +/datum/design/item/modularcomponent/cpu/photonic + name = "photonic processor unit" + id = "pcpu_normal" + req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 4) + build_type = IMPRINTER + materials = list(DEFAULT_WALL_MATERIAL = 32000, glass = 8000) + chemicals = list("sacid" = 40) + build_path = /obj/item/weapon/computer_hardware/processor_unit/photonic + sort_string = "VBAAX" + +/datum/design/item/modularcomponent/cpu/photonic/small + name = "photonic processor unit" + id = "pcpu_normal" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3) + build_type = IMPRINTER + materials = list(DEFAULT_WALL_MATERIAL = 16000, glass = 4000) + chemicals = list("sacid" = 20) + build_path = /obj/item/weapon/computer_hardware/processor_unit/photonic/small + sort_string = "VBAAY" /* CIRCUITS BELOW */ diff --git a/icons/obj/modular_components.dmi b/icons/obj/modular_components.dmi index e2aca17340a1bd2b0610b6f3eeea9010ff4e97bf..3594a12c17f70f3b71af1027e7671db465c53934 100644 GIT binary patch literal 3291 zcma))C<=ywUEIi#-5v?l> zcGS=DFNg3C`w;wUw9*y$XuU&ZMXrYRJDn?CuNAt6r%?9>Yons>6^^wZa%*~B#@g7I z2fNv}CRgwYPPWNG$lq0H*6q-77M^o?2|uBrX|`r`UG6uS*}Wz8%Mxhe^NqN<2KaxrusPsX&*--2ywXr+(SX}u;dn-*J zg}uI^li6+Pq1&vTk(xyX2Bt8eCpqR>41s&)*YYRwKa+z(vY_rO#}f+DcP#8bf1~B1 zWJI4UbFbP1hE|4r$;CM!lYt&U!P6ahu6Z74PnWZj#>N;6%J)am&l`7CWF9|H;m?Jj zZEOJSNNFnuUu>c%B;sdKNMU&XSzTKCFmoxa+k49$D`X%j@2&V-P>q|3)}i|gw;1f% zb@)C;D%fWrOp{!5mK;LUr%S);WmC;w^7~dh zcr`j%o$}1^vnSwKH@)DqeTYJhNrvtrQ+^(#AZj8Q*X4kVQpTHmOV13Qr+^k={ovp$ z>ivvh-ktOJB{*+}&#CBt_OV2!=y6=pqlRDADYpO?nZ_m4t}EK6jB}!(fGiYpQTE_w z4_Y?yc=}!s=rMs+&g|c{rgFZmlVo->PzjdbHtrUeqqSjUGK*ml>|4zfcAt+9jX|)B z_az#EA}9rLc_?#0bN2iUx^m#QjZM9WN^oW?kiUMS@i<0$wyfeiTP`_UD37s{!YBGx zNFgSfq-t5LTf1<~s!Ct=$~%|#*+uPAcOVv65{NfvWkSf&5yBjQ->JrNQ8idcbT ze<1#<9T^$yU&7j#pl3JU(?z#XDLZ&tKyAvn_0xyl=^FOLhE+aw7bSJ9-{1j45F({H z<*`RMcT=ND9Gyijyk9Svu9+DqKH8-*3;c$a$q^wCGERIhQt6f~*u=ZNgA@s$BBEowYFf zEagP(jUVA^G1}(AQ1o*CcDH>tk$7y{pGYf%E#ea!2Kixj4$)-`qaLGfi{Ys4L_1z# zX2~i~O_D8VODMPo+7K7ln=HZ2bagJSkPPtsQ1Xe?4Vm|jCwX>n_d}Sh*3oy``R@r` zo*t~>HCivA{>4$+BLmzViFC$RQ}z75gNx@dUj>E(XVCL+(cpKs+8z$90b_i-zoL6O z;p;NzYaYMkqc>tWsBvVv-_E(Ug-zOIn-p|r`{7G8y+|n@p)|VV%xUQraN4cKO%~f>*Lx?|&I=SFLGm#lUOi~! zl35Tndg`A2k4-7RxAFE$E6W99yD9)~LWIyE)&gwb+*JY_&BYzGbOmer&Sxy3bJn@p zCE*w00I-oEvUmF0{+M$gaeL9jx}fo-vj}cEefh~*Yk`^0Y*(eJOb~&VVH~K5n4>kB zO^ew%3d;Z38CLVv%8-t1q<=#kZZhVUhDID|*|*BB0UDScqEot9QNsxdEK8hM`Nd^j zq(w47T)$}`dScUU9wM~2wH@6A?fMSR$1v|MZJ#7A^yA&%tn+<*%J*$H4i4$+V?C(k zt*A``d4+IUpv{Zn(1p+TtZY4T^C z&e{@>g%)^kj8ViRpP_y@jJt8Q_=fJ^c#FV_1}AXYFESG5<2biF-?mFqU_G1;Vl(m zwyD?VMIMqWx7FeD4gUkGU&Zhbyh!KmRPEIH!`CFGCb!)2+vh1T7onIQ(5aYY8_k`k zRXzLT(Fr8fu%Ld~yNgVQ>a3^CP_ss;+4%gMSo262XZLlv8Zf4aa_k*xbmsjLyqDAlz_ z`*t6=@Z|arzgaydRe;x^+A;`Vv6NY}Ipwyt(uZrRmlHJddbR3o%Nsd8VU9PS8Vk&> zR)!cr;Yi?^118jluLa{@?I4kV3UL};$^UqFB(9s29#HH7S|ZbS??-c}1V@1(3RG-| zjQL&~SA-`D7p-}#=yxsa28}XsEneF)Mep*XzimrS>)c8`g3}H(4T(bWNU)<0|3}p-m!N1WW~k8b zCiH))L7iy19jMnJbSGs|w}6miQev?)5uq4*`ck!bI6e)W00yj+2Mgr!s}{USfUSLY zgYlN&*iEfn!LdY=IZG9X=|^G8yC8iG(~+Nf0~?lpxti&^PfR_~j>Q@jYs>@uAJH3}(j)8=#YDSQOUTwrlZMRqnL!o_D z@uuwb(L1UKBIka_h>GKT1UQGDUOroApmo=3ZNGdT(R;a!8NHGNEY(f^7$>>c88kk+ zCRUha6VY$0TP?BGkQM8N#_jPrL~?(Z?A~@`2hP6V8bnMzS@v|QUkJ>nDxbT^?*p1& zf8($(K<(LT;n2@VUZ8ajVV1+ZEOcA)E{}~|Kkc#Racp>4=ChpTBZ_=oRGRE@--yTw z_7d#{saQ}_upYyphP8B#Y;*=^>bE?(5XnELXVCAkO1GHoboTOh%AQc2gkkcAsqz#=mQ^hqu()ZIo2Dp*t5Y88y>Bc_&)zlldQH|ISU2CHzF9#t{b;7^RMVVDp;I1WsaWu-`rLKbgLYH(dpHF_8*QcKl^Qxl{Trm-S>^x$ literal 2639 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 diff --git a/icons/obj/modular_laptop.dmi b/icons/obj/modular_laptop.dmi index 583def71e5082122985ce3284f217bfe5de58d8c..8ee252055cf41c852d8c6595c2b9c8bb6101395e 100644 GIT binary patch literal 25753 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

Y+f{K;v8>)uanRb`nDqQKx|T?XW#RQj?nx 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

{9?v|6O~o6!aJLqv@QoC);2M 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 YX+An$r|X>scBWFWllCXdk6(ZA4_k6KHvj+t diff --git a/icons/obj/modular_tablet.dmi b/icons/obj/modular_tablet.dmi index fb0e1fd9c921bafde058733a6e910893e9f4a569..1872315f49f0acc11771ebb495858e7bcb741e6b 100644 GIT binary patch delta 1352 zcmV-O1-JUC3%d)DBtD-|OjJd{z`$f=WPyQ!C@3iZ0001#`!h5DARr+B%mDxY00000 z0RI3p|1+5Y003$L0GR;HGXTuY%rpOHkzW-L0FU>msHgyt`CngO0G9oci9!{7j+m$b z0004WQchCC`6lS@v+Fc5~<@hPl!8&DgE1q&9SR;WVlh67k8nI@L} zK;wak+hetYv{8(a7oHjY-@Gg@`P24!ci@}-j(q|K?HzyM_3erkgKnvhj;L7CgYJ4d zJAo8IG#8}a4A6oVt;P@oYgQalSvcFjGAZ|uuP;(&g$=@x7kO)yYv*-;_c01aeMPe> ze~wt4u1OAQd>7`kRAUxViV0@D)8uiU6eD?8#xt_L52Oub3tmATI6&QGYsD@v`&49o zkd1eQ-eec53?SWf2;lyyMM$haHOIRj0RP@xJ(=cmo-14q3KNZ{-pzvh$P#r~kAzMP zxMoYfJ#0?DGXMY>3CRnF_R@u9@`4BxB$Jm7M3}&M zRt@_Dqz(HYV%o4@&l>vBj}gE=_B7AQ07~%&jjr7Hu)69oz)WXpai_Z2|- z`S*N;Vs0S%i#YlK=JZdqBGu6bIDrP{Xdom&?7s_5;{J7X8z4y#U?^h$KokE*N&o-= z0000$0R3(a`qzd1`}p<2CwPnolncr4=SQm#KEb101MCBA&mc3QLG{5W7~X*N0BTne zqw^E&RUdqU{WlPQswau4yR{mnYi+&^C))r30000000000BBg8?r@m;Q0xXwH_6a2Y z+)-wNt~=@rrIc~6=m2pvzyw%2*aleLj?cg~aEQ(|U^uc2%2s{9Tb2&Vv5rX?QS9O1N{Dd`}ACZAiYT4 zjc;ILE1&|5|5b=@0000000000005C9ed?F=S;H{8H&|7CfFz*<*o_Hiz^f_@dRo&B0?{B6?Oc7c|i{kFoFicj*y>^;wH%IzMoR~ zc~TF*h#g9pprn_bb#ebL=`%YZH>CjGwLs`rV)P@u4-DM^vwxTL#vf-u(z#bDL685P z7ytkO00000005B^x)pf-UlqIQm#?m_SF6>{^>usi-k{y=ash<>yeeun(<)7=0D^v* zZ+YE+-n%y#+CW_>JyQ!ZfS_OH>tb!lSM9xfgVKIJ-Bm;w3_L<_a^wH@cAej~_wEgb zHgLX$3LxmyeC^2Jw)gH0`uR%x{j{$Jrn_t4roDG>@SyE+DjlIr2texZ?mh26wD;}} zO8a|TkZXxFm0002Mf5|^7PKDwj?++*d0000< KMNUMnLSTZqD{V6X delta 1393 zcmV-%1&;c=3#ki`B!8k%OjJd{z`$f=WPyQ!C@3iZ001*H|1?Y zH!;XFku+fHhA%;2f6Wlx8S76AJQGP}D8$54BnQ$CF8&`(som?xyHbiFhO1;6_W(l9gcm``c6j@w{hV_~x44XFkXWXj22 zamwpCH9HKdM9+kFa-rG+@k31j{!Z)(ti|?DFu};J#zY^ne+Bw~%|%c8wfGylYBi0h z8auKB|24@d(xPLS5rIoFm+SrN{A+#ySC;B;>Do-;000A-NklSyS6U5QLFe zlGjMcrU)3t;Rp#iAt(9&e=U2+f(K^C(pn`g^k@62G47t0WIRQ|!2tjOOoZeKV|(dC zGJ8UV36j~sQi2d-Q1@d zAo>R6h9VCTeFF%900Rez{b!+B+&_*s0g?m(#v=9)H1U6=1ONa400004Fz!}C*7FuB zK+t}Ecs-xb=X`({&;YZ4A78f(_!6i9FQ9>D2-DPGf5$n%zJS_ZCdSe8`L+ToK=ciS z8b}gRcWX0B*V^0-qXihd0RR9100000002aa^r?SnebLfS7k7{Op(D=(UH8-%N-5(` zkpTpKDh<#91YO*}+X>p2=Ni~W=Nd3GW*gx2sWdS3IY3V^R1ZIdUP1%&+_pgIJ6?tQ z>WgBbf6aU~8NjN_eARRtX#9~4*o2yCKr*0po@MsV>Y6+UyhuLZcqg+P$0jdB4h8?T}REbTA$E+^c;e_jI66K+&SS3-cyJd$LvL&zIo4w0P# z(1(x>kPUkh4;vtJH@bn@Y<6^HAN_P|aF+nwA*MLJ)b2Lq`v7ksR4-F^;~SXS5%<%l za1{z`0000000000005B^x)oTpjH7#lMZpJ15;}n0sBi}C>Uu!k87$JY-~uGa$H|l% ze<ftA`LkSa< z^t`toyq{m$0l6s!=&l7qw-Tf8>3v}A1_Ji;tv}9yq;pp(L685P7ytkO00000005B^ zx)pf*uZsQjlQ*Yl>-GBl?5w+YZ_sXbf4Km{eqNQ8T4|N0Q~*IgsTZmn zovk+p{d}eUemYbGSKD*oyt{XAaHs8YDjh^Q?ai%yeCqDq8w_tCb2lykqo05F4Sf09-TR|KX@AdMg)$+4pno&t|9*FQcX!|2 z`=h}T--&qpoc@)k-|{b>v&F38^N~f|I*jw!Tav@w9?f)meZx*h^0Z{e(_iPl?+amI Gum%9P&mj8% literal 0 HcmV?d00001 diff --git a/nano/images/status_icons/alarm_red.gif b/nano/images/status_icons/alarm_red.gif new file mode 100644 index 0000000000000000000000000000000000000000..327d58e4db8acf03e219e09ace17c6f1f990f499 GIT binary patch literal 163 zcmZ?wbhEHb6k`x$SjfO&!NBl?f#JY`0}KodivPL&TtkAL9RpmA^bD98K|()SIE@&X z8FYYbpawAp1}4op{VPwu z9gsXo3j>qGoc@)k-|laiBP6A;iLESQZs9fdE`gn;8fkWGK5X@y)0gnV&)mlFMPK)y dJkk3GD#0FQM`JW^Mtrhj=MufRCyI-~8UX$-DMkPQ literal 0 HcmV?d00001 diff --git a/nano/images/status_icons/downloader_running.gif b/nano/images/status_icons/downloader_running.gif new file mode 100644 index 0000000000000000000000000000000000000000..68fb977c86dda6273d7fbd853b86ca38375891b2 GIT binary patch literal 574 zcmZ?wbhEHb6k`x$SjfP@V8L+UzyXFIKo*1Ie{Mh5kYH!W09PYD17=2$&`%alE(T@> z9gsXo3j>qvoc@)k-|laiBP6A;iLET)R_h~=Y0o;By*jn+owOJ>9m=RW66O|OWA74h zEd}Y|KK{w)`nOoDHmPCNx3e^3MNlw1SYPk+U;jj~S*eXvYtx$-T+f^X?*g@+`~Hvr ziYQjA_3-Q8d}^(=waC@4|M+>h+K(hMVsnBCAtSzs1pCZ=|HsTbplx#B#||H@=_i@6 z8DvScK^{p97bLw{HAiD|-)GKVD{io9Ul>uM&z5A<0#03AzH(Mc%dwY>85pbqqOR3W literal 0 HcmV?d00001 diff --git a/nano/images/status_icons/ntnrc_idle.gif b/nano/images/status_icons/ntnrc_idle.gif new file mode 100644 index 0000000000000000000000000000000000000000..d47c01d580080e8e614de62448815b87705a122f GIT binary patch literal 113 zcmZ?wbhEHb6k`x$n8?7uV8L+UzyTl)1d9K;{aizWogD*Qjr0td89_onSvZXtm>6_G z@*ph?O!`y$SDt>$zc^;Wt!~{*{n8&Ar)bngYlhsO6~oo#^kK@TOEwR;%O1S>ei3K; KkwqIB7_0$IQY1tG literal 0 HcmV?d00001 diff --git a/nano/images/status_icons/ntnrc_new.gif b/nano/images/status_icons/ntnrc_new.gif new file mode 100644 index 0000000000000000000000000000000000000000..af72a8b332fc4983088ccafc64593bb04294e551 GIT binary patch literal 181 zcmZ?wbhEHb6k`x$SjfP@V8L+UzyXFIKo*1Ie{Mh5kYH!W09PYD17=2$&`%alBL-#$ z9gsXo3j>q>oc@)k-|{bxS#+yg_fo&~$HpldbQvgwk|!|k#MZ@yo| T*?wfvM*L{{:helper.link('Standard', null, { "hw_netcard" : 1 }, data.hw_netcard == 1 ? 'selected' : null)}}

+
{{:helper.link('Advanced', null, { "hw_netcard" : 2 }, data.hw_netcard == 2 ? 'selected' : null)}} {{if data.devtype != 2}} +
Processor Unit: + {{:helper.link('Standard', null, { "hw_cpu" : 1 }, data.hw_cpu == 1 ? 'selected' : null)}} + {{:helper.link('Advanced', null, { "hw_cpu" : 2 }, data.hw_cpu == 2 ? 'selected' : null)}}
Tesla Relay: {{:helper.link('None', null, { "hw_tesla" : 0 }, data.hw_tesla == 0 ? 'selected' : null)}} @@ -50,6 +54,7 @@ Battery allows your device to operate without external utility power source. Advanced batteries increase battery life.
Hard Drive stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.
Network Card allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts.
+ Processor Unit is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.
Tesla Relay is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source. This component is currently unavailable on tablet computers due to size restrictions.
Nano Printer is device that allows for various paperwork manipulations, such as, scanning of documents or printing new ones. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.
Card Reader adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards. diff --git a/nano/templates/layout_default.tmpl b/nano/templates/layout_default.tmpl index a5fd6f5804b..53701e30307 100644 --- a/nano/templates/layout_default.tmpl +++ b/nano/templates/layout_default.tmpl @@ -17,6 +17,9 @@ {{if data.PC_stationtime}}
{{:data.PC_stationtime}} {{/if}} + {{for data.PC_programheaders}} + + {{/for}}
@@ -25,6 +28,7 @@ {{:helper.link('Shutdown', null, {'PC_shutdown' : 1})}} {{if data.PC_showexitprogram}} {{:helper.link('Exit Program', null, {'PC_exit' : 1})}} + {{:helper.link('Minimize Program', null, {'PC_minimize' : 1})}} {{/if}} From 409a832646d23b975079c67e43f9c4736b3e71e0 Mon Sep 17 00:00:00 2001 From: Atlantis Date: Fri, 8 Jan 2016 01:55:56 +0100 Subject: [PATCH 26/28] Fixes #11931 + Design bug - NTNRC conversations are now rather matched by Unique ID that's assigned on New(), rather than name. This has a nice side effect of being able to have conversations that share names. - Tweaks design datums a bit. Renames "processor unit" to "computer processor unit", etc. since i noticed telecomms machine already uses "processor unit" name. Also corrects duplicated ID. --- .../modular_computers/NTNet/NTNRC/conversation.dm | 5 +++++ .../file_system/programs/ntnrc_client.dm | 6 +++--- code/modules/research/designs.dm | 10 +++++----- nano/templates/ntnet_chat.tmpl | 2 +- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm index 3162c94221a..81f2025aea2 100644 --- a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm +++ b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm @@ -1,4 +1,7 @@ +var/global/ntnrc_uid = 0 + /datum/ntnet_conversation/ + var/id = null var/title = "Untitled Conversation" var/datum/computer_file/program/chatclient/operator // "Administrator" of this channel. Creator starts as channel's operator, var/list/messages = list() @@ -6,6 +9,8 @@ var/password /datum/ntnet_conversation/New() + id = ntnrc_uid + ntnrc_uid++ if(ntnet_global) ntnet_global.chat_channels.Add(src) ..() diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm index 9f7efb5449f..431b08c10b5 100644 --- a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -32,8 +32,7 @@ if(href_list["PRG_joinchannel"]) var/datum/ntnet_conversation/C for(var/datum/ntnet_conversation/chan in ntnet_global.chat_channels) - world << "DEBUG L35/NTNRC_CLIENT.DM: \"[href_list["PRG_joinchannel"]]\" / \"[chan.title]\"" - if(chan.title == href_list["PRG_joinchannel"]) + if(chan.id == text2num(href_list["PRG_joinchannel"])) C = chan break @@ -205,7 +204,8 @@ for(var/datum/ntnet_conversation/conv in ntnet_global.chat_channels) if(conv && conv.title) all_channels.Add(list(list( - "chan" = conv.title + "chan" = conv.title, + "id" = conv.id ))) data["all_channels"] = all_channels diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index a9a264ec48d..cf55081eaa9 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -917,7 +917,7 @@ other types of metals and chemistry for reagents). sort_string = "VBAAU" /datum/design/item/modularcomponent/cpu/ - name = "processor unit" + name = "computer processor unit" id = "cpu_normal" req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2) build_type = IMPRINTER @@ -927,7 +927,7 @@ other types of metals and chemistry for reagents). sort_string = "VBAAV" /datum/design/item/modularcomponent/cpu/small - name = "microprocessor unit" + name = "computer microprocessor unit" id = "cpu_small" req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) build_type = IMPRINTER @@ -937,7 +937,7 @@ other types of metals and chemistry for reagents). sort_string = "VBAAW" /datum/design/item/modularcomponent/cpu/photonic - name = "photonic processor unit" + name = "computer photonic processor unit" id = "pcpu_normal" req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 4) build_type = IMPRINTER @@ -947,8 +947,8 @@ other types of metals and chemistry for reagents). sort_string = "VBAAX" /datum/design/item/modularcomponent/cpu/photonic/small - name = "photonic processor unit" - id = "pcpu_normal" + name = "computer photonic microprocessor unit" + id = "pcpu_small" req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3) build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 16000, glass = 4000) diff --git a/nano/templates/ntnet_chat.tmpl b/nano/templates/ntnet_chat.tmpl index 6424e073e25..592b6481770 100644 --- a/nano/templates/ntnet_chat.tmpl +++ b/nano/templates/ntnet_chat.tmpl @@ -60,7 +60,7 @@ Available channels: {{for data.all_channels}} -
{{:helper.link(value.chan, null, {'PRG_joinchannel' : value.chan})}}
+
{{:helper.link(value.chan, null, {'PRG_joinchannel' : value.id})}}
{{/for}}
{{/if}} \ No newline at end of file From 4de4cac9be2b8fd4fc5ea13b6281c53357b36cce Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 8 Jan 2016 09:08:44 +0300 Subject: [PATCH 27/28] Makes inventory slots forward clicks to items in them. In effect that means you don't have to pixelhunt item in the slot, just click the slot. Smoking cigs is easy mode now. --- code/modules/mob/inventory.dm | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index e1061b09958..1cf2f4319ee 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -1,7 +1,13 @@ //This proc is called whenever someone clicks an inventory ui slot. /mob/proc/attack_ui(slot) var/obj/item/W = get_active_hand() - if(istype(W)) + var/obj/item/E = get_equipped_item(slot) + if (istype(E)) + if(istype(W)) + E.attackby(W,src) + else + E.attack_hand(src) + else equip_to_slot_if_possible(W, slot) /mob/proc/put_in_any_hand_if_possible(obj/item/W as obj, del_on_fail = 0, disable_warning = 1, redraw_mob = 1) @@ -186,7 +192,7 @@ var/list/slot_equipment_priority = list( \ wear_mask = null update_inv_wear_mask(0) return - + /mob/proc/isEquipped(obj/item/I) if(!I) return 0 From 5e1629768dbf9074f8f6d842ae148c33ef702673 Mon Sep 17 00:00:00 2001 From: ccomp5950 Date: Fri, 8 Jan 2016 01:27:47 -0500 Subject: [PATCH 28/28] Unit Tests: Disables asteroid generation. Speeds the startup by 60 seconds. Unable to test the asteroid for a vacuum though. --- code/unit_tests/unit_test.dm | 4 +++- code/unit_tests/zas_tests.dm | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm index e8a413f07f9..dac62a552eb 100644 --- a/code/unit_tests/unit_test.dm +++ b/code/unit_tests/unit_test.dm @@ -67,10 +67,12 @@ datum/unit_test/proc/check_result() proc/load_unit_test_changes() - +/* + //This takes about 60 seconds to run on Travis and is only used for the ZAS vacume check on The Asteroid. if(config.generate_asteroid != 1) log_unit_test("Overiding Configuration option for Asteroid Generation to ENABLED") config.generate_asteroid = 1 // The default map requires it, the example config doesn't have this enabled. + */ diff --git a/code/unit_tests/zas_tests.dm b/code/unit_tests/zas_tests.dm index e39ead59a0e..8d1d04f64ee 100644 --- a/code/unit_tests/zas_tests.dm +++ b/code/unit_tests/zas_tests.dm @@ -133,7 +133,7 @@ datum/unit_test/zas_area_test/incinerator name = "ZAS: Incinerator" area_path = /area/maintenance/incinerator disabled = 1 - why_disabled = "Failing currently for existing bug: #11846" + why_disabled = "Incernator blast doors not blocking air flow. See bug #11846" datum/unit_test/zas_area_test/virology name = "ZAS: Virology" @@ -151,11 +151,14 @@ datum/unit_test/zas_area_test/west_hall_mining_outpost name = "ZAS: Mining outpost West Hallway" area_path = /area/outpost/mining_main/west_hall +/* datum/unit_test/zas_area_test/mining_area name = "ZAS: Mining Area (Vacuum)" area_path = /area/mine/explored expectation = UT_VACUUM - + disabled = 1 + why_disabled = "Asteroid Generation disabled" + */ datum/unit_test/zas_area_test/ name = "ZAS: Cargo Bay" area_path = /area/quartermaster/storage