From 469c01daf9e8e4860b97ff4baabdc884081720dc Mon Sep 17 00:00:00 2001 From: Neerti Date: Wed, 6 Apr 2016 03:31:21 -0400 Subject: [PATCH 1/2] Manually ports Bay's volume inventory system. --- code/game/objects/items.dm | 3 +- .../objects/items/weapons/storage/backpack.dm | 6 +- .../objects/items/weapons/storage/bags.dm | 14 +- .../objects/items/weapons/storage/belt.dm | 3 +- .../objects/items/weapons/storage/boxes.dm | 10 +- .../objects/items/weapons/storage/fancy.dm | 51 +++--- .../objects/items/weapons/storage/firstaid.dm | 1 - .../objects/items/weapons/storage/lockbox.dm | 1 - .../objects/items/weapons/storage/misc.dm | 1 - .../objects/items/weapons/storage/storage.dm | 156 ++++++++++++++++-- .../objects/items/weapons/storage/toolbox.dm | 2 +- .../items/weapons/storage/uplink_kits.dm | 1 - code/modules/mob/living/inventory.dm | 4 +- code/modules/power/lighting.dm | 2 +- code/modules/reagents/Chemistry-Machinery.dm | 4 +- .../research/xenoarchaeology/tools/tools.dm | 3 +- icons/mob/screen1.dmi | Bin 174072 -> 174329 bytes 17 files changed, 187 insertions(+), 75 deletions(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index f66b668664..2934e5d68d 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -10,6 +10,7 @@ var/burn_point = null var/burning = null var/hitsound = null + 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 @@ -358,7 +359,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 1f1d5e9eec..c26680797a 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 = 5 + max_storage_space = 16 /obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W as obj, mob/user as mob) if (src.use_sound) @@ -53,6 +53,7 @@ icon_state = "holdingpack" max_w_class = 4 max_storage_space = 56 + storage_cost = 29 New() ..() @@ -77,7 +78,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 33fa1d6d7e..476bf1a67e 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 = 100 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 = 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) @@ -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 = 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/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 399bd0b7a2..7f4c22dea5 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") sprite_sheets = list("Teshari" = 'icons/mob/species/seromi/belt.dmi') @@ -121,7 +123,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 62a9117de1..e7a1cd97cb 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -498,7 +498,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() ..() @@ -612,11 +611,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 @@ -625,14 +623,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) @@ -650,7 +647,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 @@ -696,7 +693,6 @@ icon_state = "portafreezer" item_state = "medicalpack" foldable = null - 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 diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 1af88c9fa8..1651ba6a68 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -68,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 @@ -89,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 @@ -144,27 +142,45 @@ for(var/i = 1 to storage_slots) new /obj/item/clothing/mask/smokable/cigarette(src) create_reagents(15 * storage_slots)//so people can inject cigarettes without opening a packet, now with being able to inject the whole one + flags |= OPENCONTAINER /obj/item/weapon/storage/fancy/cigarettes/update_icon() icon_state = "[initial(icon_state)][contents.len]" return /obj/item/weapon/storage/fancy/cigarettes/remove_from_storage(obj/item/W as obj, atom/new_location) + // Don't try to transfer reagents to lighters + if(istype(W, /obj/item/clothing/mask/smokable/cigarette)) var/obj/item/clothing/mask/smokable/cigarette/C = W - if(!istype(C)) return // what reagents.trans_to_obj(C, (reagents.total_volume/contents.len)) - ..() + ..() /obj/item/weapon/storage/fancy/cigarettes/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) if(!istype(M, /mob)) return - if(M == user && user.zone_sel.selecting == O_MOUTH && contents.len > 0 && !user.wear_mask) - var/obj/item/clothing/mask/smokable/cigarette/W = new /obj/item/clothing/mask/smokable/cigarette(user) - reagents.trans_to_obj(W, (reagents.total_volume/contents.len)) - user.equip_to_slot_if_possible(W, slot_wear_mask) + if(M == user && user.zone_sel.selecting == "mouth") + // Find ourselves a cig. Note that we could be full of lighters. + var/obj/item/clothing/mask/smokable/cigarette/cig = null + for(var/obj/item/clothing/mask/smokable/cigarette/C in contents) + cig = C + break + + if(cig == null) + user << "Looks like the packet is out of cigarettes." + return + + // Instead of running equip_to_slot_if_possible() we check here first, + // to avoid dousing cig with reagents if we're not going to equip it + if(!cig.mob_can_equip(user, slot_wear_mask)) + return + + // We call remove_from_storage first to manage the reagent transfer and + // UI updates. + remove_from_storage(cig, null) + user.equip_to_slot(cig, slot_wear_mask) + reagents.maximum_volume = 15 * contents.len - contents.len-- user << "You take a cigarette out of the pack." update_icon() else @@ -248,21 +264,6 @@ reagents.trans_to_obj(C, (reagents.total_volume/contents.len)) ..() -/obj/item/weapon/storage/fancy/cigar/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - if(!istype(M, /mob)) - return - - if(M == user && user.zone_sel.selecting == O_MOUTH && contents.len > 0 && !user.wear_mask) - var/obj/item/clothing/mask/smokable/cigarette/cigar/W = new /obj/item/clothing/mask/smokable/cigarette/cigar(user) - reagents.trans_to_obj(W, (reagents.total_volume/contents.len)) - user.equip_to_slot_if_possible(W, slot_wear_mask) - reagents.maximum_volume = 15 * contents.len - contents.len-- - user << "You take a cigar out of the case." - update_icon() - else - ..() - /* * Vial Box */ diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index dad95da904..9b9918d92f 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -162,7 +162,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 33d462eff2..e8f09a0ab3 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 eb63c96cb8..e024e6ca5c 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 3cb92b0a3c..472e1a6ef4 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -14,10 +14,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_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/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. If null, it uses the volume-based storage instead. 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. @@ -29,6 +35,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) ..() @@ -92,11 +104,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 @@ -106,6 +126,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) @@ -157,7 +180,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" @@ -183,6 +206,52 @@ 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/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() + + 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 @@ -214,12 +283,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,12 +298,12 @@ /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) 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 @@ -249,9 +320,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() @@ -260,7 +331,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))) @@ -437,12 +508,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" @@ -500,4 +607,19 @@ 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 + switch(w_class) + if(1) + return 1 + if(2) + return 2 + if(3) + return 4 + if(4) + return 8 + if(5) + return 16 + else + return 1000 diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index a5e8e31cd8..923ad9bba9 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 4f80e85a52..4e427c8f6e 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/living/inventory.dm b/code/modules/mob/living/inventory.dm index 1cd446eaec..c1aa244d55 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -10,13 +10,13 @@ // 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) + if(backpack.can_be_inserted(newitem, 1)) newitem.forceMove(src.back) 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.forceMove(S) return 1 return 0 diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 4bbce17aa1..f3596a5d9a 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -590,7 +590,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/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index d176ab205e..d69bd5a13c 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -366,13 +366,13 @@ return if(istype(O,/obj/item/weapon/storage/bag/plants)) + var/obj/item/weapon/storage/bag/plants/bag = O var/failed = 1 for(var/obj/item/G in O.contents) if(!G.reagents || !G.reagents.total_volume) continue failed = 0 - O.contents -= G - G.loc = src + bag.remove_from_storage(G, src) holdingitems += G if(holdingitems && holdingitems.len >= limit) break diff --git a/code/modules/research/xenoarchaeology/tools/tools.dm b/code/modules/research/xenoarchaeology/tools/tools.dm index e16db119c5..bc9d0ca21f 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 = 100 max_w_class = 3 can_hold = list(/obj/item/weapon/fossil) diff --git a/icons/mob/screen1.dmi b/icons/mob/screen1.dmi index d72a362422d07f90446cd03aaadc5d2e8384976e..3fb762334c4df77ec01f20f8059a2f680c9ff4eb 100644 GIT binary patch delta 19961 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 Q2Nd}1@d@z0|JA%=-} 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%0DsFu<458dl+t;2{WGxE)R>A^k%5ML3wt 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 SwdLIs@UgXWu*|dYiu^D7ym7Pu From 25c04df5bde6bc397e37146c692c06fc9c626621 Mon Sep 17 00:00:00 2001 From: Neerti Date: Wed, 6 Apr 2016 06:25:23 -0400 Subject: [PATCH 2/2] Polaris tweaks. Fixes mistake involving belts. Fixes mistake involving bags allowing w_class 5 items, which was from the manual merge. Polaris tweaks Makes inflatables w_class 3. Spacesuits and RIGs are now w_class 5. Both sniper weapons are now w_class 5. Makes more inventories able to use the volume based system. Cleans up the cig part of the port a bit. --- .../objects/items/weapons/storage/backpack.dm | 7 ++-- .../objects/items/weapons/storage/belt.dm | 2 +- .../objects/items/weapons/storage/boxes.dm | 15 ++++---- .../objects/items/weapons/storage/fancy.dm | 13 +++---- .../objects/items/weapons/storage/misc.dm | 2 +- .../objects/items/weapons/storage/storage.dm | 4 +- code/game/objects/structures/inflatable.dm | 3 +- code/modules/clothing/spacesuits/captain.dm | 2 +- code/modules/clothing/spacesuits/rig/rig.dm | 2 +- .../modules/clothing/spacesuits/spacesuits.dm | 2 +- code/modules/clothing/suits/armor.dm | 1 + code/modules/clothing/suits/storage.dm | 2 - .../clothing/under/accessories/storage.dm | 3 +- code/modules/projectiles/guns/energy/laser.dm | 2 +- .../projectiles/guns/projectile/sniper.dm | 2 +- .../changelogs/Neerti-InventorySystemPort.yml | 38 +++++++++++++++++++ 16 files changed, 68 insertions(+), 32 deletions(-) create mode 100644 html/changelogs/Neerti-InventorySystemPort.yml diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index c26680797a..8509172581 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 = 5 - max_storage_space = 16 + max_w_class = 4 + max_storage_space = 28 /obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W as obj, mob/user as mob) if (src.use_sound) @@ -155,8 +155,7 @@ slot_r_hand_str = "duffle", ) slowdown = 1 - max_storage_space = 38 - storage_slots = 12 + max_storage_space = 36 /obj/item/weapon/storage/backpack/dufflebag/syndie name = "black dufflebag" diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 7f4c22dea5..478272b8b2 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -5,6 +5,7 @@ icon_state = "utilitybelt" item_state = "utility" storage_slots = 7 + max_storage_space = 28 //This should ensure belts always have enough room to store whatever. max_w_class = 3 slot_flags = SLOT_BELT attack_verb = list("whipped", "lashed", "disciplined") @@ -124,7 +125,6 @@ icon_state = "securitybelt" item_state = "security" max_w_class = 3 - max_storage_space = 28 can_hold = list( /obj/item/weapon/grenade, /obj/item/weapon/reagent_containers/spray/pepper, diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index e7a1cd97cb..657d2f4f5a 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -25,6 +25,7 @@ icon_state = "box" item_state = "syringe_kit" var/foldable = /obj/item/stack/material/cardboard // BubbleWrap - if set, can be folded (when empty) into a sheet of cardboard + max_w_class = 2 // BubbleWrap - A box can be folded up to make card /obj/item/weapon/storage/box/attack_self(mob/user as mob) @@ -502,7 +503,7 @@ New() ..() if(src.type == /obj/item/weapon/storage/box/monkeycubes) - for(var/i = 1; i <= 5; i++) + for(var/i = 1 to 5) new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src) /obj/item/weapon/storage/box/monkeycubes/farwacubes @@ -510,7 +511,7 @@ desc = "Drymate brand farwa cubes, shipped from Ahdomai. Just add water!" New() ..() - for(var/i = 1; i <= 5; i++) + for(var/i = 1 to 5) new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/farwacube(src) /obj/item/weapon/storage/box/monkeycubes/stokcubes @@ -518,7 +519,7 @@ desc = "Drymate brand stok cubes, shipped from Moghes. Just add water!" New() ..() - for(var/i = 1; i <= 5; i++) + for(var/i = 1 to 5) new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/stokcube(src) /obj/item/weapon/storage/box/monkeycubes/neaeracubes @@ -526,7 +527,7 @@ desc = "Drymate brand neaera cubes, shipped from Jargon 4. Just add water!" New() ..() - for(var/i = 1; i <= 5; i++) + for(var/i = 1 to 5) new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube(src) /obj/item/weapon/storage/box/ids @@ -614,7 +615,7 @@ can_hold = list(/obj/item/toy/snappop) New() ..() - for(var/i=1; i <= 8; i++) + for(var/i = 1 to 8) new /obj/item/toy/snappop(src) /obj/item/weapon/storage/box/matches @@ -629,7 +630,7 @@ New() ..() - for(var/i=1; i <= 10; i++) + for(var/i=1 to 10) new /obj/item/weapon/flame/match(src) attackby(obj/item/weapon/flame/match/W as obj, mob/user as mob) @@ -647,7 +648,7 @@ icon_state = "syringe" New() ..() - for (var/i; i <= 7; i++) + for (var/i = 1 to 7) new /obj/item/weapon/reagent_containers/hypospray/autoinjector(src) /obj/item/weapon/storage/box/lights diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 1651ba6a68..758ac8dc39 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -53,7 +53,7 @@ /obj/item/weapon/storage/fancy/egg_box/New() ..() - for(var/i=1; i <= storage_slots; i++) + for(var/i=1 to storage_slots) new /obj/item/weapon/reagent_containers/food/snacks/egg(src) return @@ -74,7 +74,7 @@ /obj/item/weapon/storage/fancy/candle_box/New() ..() - for(var/i=1; i <= 5; i++) + for(var/i=1 to 5) new /obj/item/weapon/flame/candle(src) return @@ -159,12 +159,9 @@ if(!istype(M, /mob)) return - if(M == user && user.zone_sel.selecting == "mouth") + if(M == user && user.zone_sel.selecting == O_MOUTH) // Find ourselves a cig. Note that we could be full of lighters. - var/obj/item/clothing/mask/smokable/cigarette/cig = null - for(var/obj/item/clothing/mask/smokable/cigarette/C in contents) - cig = C - break + var/obj/item/clothing/mask/smokable/cigarette/cig = locate() in src if(cig == null) user << "Looks like the packet is out of cigarettes." @@ -279,7 +276,7 @@ /obj/item/weapon/storage/fancy/vials/New() ..() - for(var/i=1; i <= storage_slots; i++) + for(var/i=1 to 6) new /obj/item/weapon/reagent_containers/glass/beaker/vial(src) return diff --git a/code/game/objects/items/weapons/storage/misc.dm b/code/game/objects/items/weapons/storage/misc.dm index e024e6ca5c..8d954d5306 100644 --- a/code/game/objects/items/weapons/storage/misc.dm +++ b/code/game/objects/items/weapons/storage/misc.dm @@ -21,7 +21,7 @@ /obj/item/weapon/storage/box/donut/New() ..() - for(var/i=1; i <= startswith; i++) + for(var/i=1 to startswith) new /obj/item/weapon/reagent_containers/food/snacks/donut/normal(src) update_icon() return diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 472e1a6ef4..431b5ca4d7 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -14,7 +14,7 @@ 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 = 3 //Max size of objects that this object can store (in effect only if can_hold isn't set) + 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_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. If null, it uses the volume-based storage instead. var/obj/screen/storage/boxes = null @@ -322,7 +322,7 @@ if (max_w_class != null && W.w_class > max_w_class) if(!stop_messages) - usr << "[W] is too long for this [src]." + usr << "[W] is too long for \the [src]." return 0 var/total_storage_space = W.get_storage_cost() diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 3d867111cc..20b326ebc9 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -40,7 +40,7 @@ /obj/structure/inflatable/bullet_act(var/obj/item/projectile/Proj) var/proj_damage = Proj.get_structure_damage() if(!proj_damage) return - + health -= proj_damage ..() if(health <= 0) @@ -248,6 +248,7 @@ desc = "Contains inflatable walls and doors." icon_state = "inf_box" item_state = "syringe_kit" + w_class = 3 max_storage_space = 28 can_hold = list(/obj/item/inflatable) diff --git a/code/modules/clothing/spacesuits/captain.dm b/code/modules/clothing/spacesuits/captain.dm index 38cfc4a84b..e99dc6d8ce 100644 --- a/code/modules/clothing/spacesuits/captain.dm +++ b/code/modules/clothing/spacesuits/captain.dm @@ -15,7 +15,7 @@ desc = "A bulky, heavy-duty piece of exclusive corporate armor. YOU are in charge!" icon_state = "caparmor" item_state = "capspacesuit" - w_class = 4 + w_class = 5 gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 item_flags = STOPPRESSUREDAMAGE diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index f123f17b55..7db3dd1dc1 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -14,7 +14,7 @@ slot_flags = SLOT_BACK req_one_access = list() req_access = list() - w_class = 4 + w_class = 5 // These values are passed on to all component pieces. armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20) diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index 7014e9cf41..ecac722204 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -51,7 +51,7 @@ desc = "A suit that protects against low pressure environments. \"NORTHERN STAR\" is written in large block letters on the back." icon_state = "space" item_state = "s_suit" - w_class = 4//bulky item + w_class = 5 // So you can't fit this in your bag and be prepared at all times. gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index f98f222b93..5b5c706fa8 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -143,6 +143,7 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen) slowdown = 1 + w_class = 5 armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 100, rad = 100) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm index e0cbb20ced..2534845173 100644 --- a/code/modules/clothing/suits/storage.dm +++ b/code/modules/clothing/suits/storage.dm @@ -4,7 +4,6 @@ /obj/item/clothing/suit/storage/New() ..() pockets = new/obj/item/weapon/storage/internal(src) - pockets.storage_slots = 2 //two slots pockets.max_w_class = 2 //fit only pocket sized items pockets.max_storage_space = 4 @@ -77,7 +76,6 @@ /obj/item/clothing/suit/storage/vest/heavy/New() ..() pockets = new/obj/item/weapon/storage/internal(src) - pockets.storage_slots = 4 pockets.max_w_class = 2 pockets.max_storage_space = 8 diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 1a181ac49a..0e9a004a2e 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -12,7 +12,8 @@ /obj/item/clothing/accessory/storage/New() ..() hold = new/obj/item/weapon/storage/internal(src) - hold.storage_slots = slots + hold.max_storage_space = slots * 2 + hold.max_w_class = 2 /obj/item/clothing/accessory/storage/attack_hand(mob/user as mob) if (has_suit) //if we are part of a suit diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index c21fc97bd8..466170e52a 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -89,7 +89,7 @@ obj/item/weapon/gun/energy/retro max_shots = 4 fire_delay = 35 force = 10 - w_class = 4 + w_class = 5 // So it can't fit in a backpack. accuracy = -3 //shooting at the hip scoped_accuracy = 0 diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index e38740e732..e03ff73988 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -3,7 +3,7 @@ desc = "A portable anti-armour rifle fitted with a scope, the HI PTR-7 Rifle was originally designed to used against armoured exosuits. It is capable of punching through windows and non-reinforced walls with ease. Fires armor piercing 14.5mm shells." icon_state = "heavysniper" item_state = "l6closednomag" //placeholder - w_class = 4 + w_class = 5 // So it can't fit in a backpack. force = 10 slot_flags = SLOT_BACK origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 2, TECH_ILLEGAL = 8) diff --git a/html/changelogs/Neerti-InventorySystemPort.yml b/html/changelogs/Neerti-InventorySystemPort.yml new file mode 100644 index 0000000000..db9dd5d2fc --- /dev/null +++ b/html/changelogs/Neerti-InventorySystemPort.yml @@ -0,0 +1,38 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Neerti + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Ports Bay's volume-based inventory system. It works off by weight classes instead of just slots, allowing you to hold more light items than you could previously." + - rscadd: "Bulky items can now go in your backpack, however it will require twice the space of a normal sized item." + - rscdel: "Spacesuits, RIGs, and sniper rifles made heavier."