Merge pull request #1368 from Neerti/4/6/2016_new_inventory_port

Ports Bay's new inventory system.
This commit is contained in:
EmperorJon
2016-04-16 02:58:07 +01:00
27 changed files with 240 additions and 92 deletions
+2 -1
View File
@@ -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
@@ -22,7 +22,7 @@
)
w_class = 4
slot_flags = SLOT_BACK
max_w_class = 3
max_w_class = 4
max_storage_space = 28
/obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W as obj, mob/user as mob)
@@ -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
@@ -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"
@@ -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)
@@ -4,6 +4,9 @@
icon = 'icons/obj/clothing/belts.dmi'
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")
sprite_sheets = list("Teshari" = 'icons/mob/species/seromi/belt.dmi')
@@ -121,9 +124,7 @@
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(
/obj/item/weapon/grenade,
/obj/item/weapon/reagent_containers/spray/pepper,
@@ -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)
@@ -498,12 +499,11 @@
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()
..()
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
@@ -511,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
@@ -519,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
@@ -527,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
@@ -612,11 +612,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 to 8)
new /obj/item/toy/snappop(src)
/obj/item/weapon/storage/box/matches
@@ -625,14 +624,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 to 10)
new /obj/item/weapon/flame/match(src)
attackby(obj/item/weapon/flame/match/W as obj, mob/user as mob)
@@ -650,7 +648,7 @@
icon_state = "syringe"
New()
..()
for (var/i; i < storage_slots; i++)
for (var/i = 1 to 7)
new /obj/item/weapon/reagent_containers/hypospray/autoinjector(src)
/obj/item/weapon/storage/box/lights
@@ -696,7 +694,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
@@ -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
@@ -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 to 5)
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,42 @@
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 == O_MOUTH)
// Find ourselves a cig. Note that we could be full of lighters.
var/obj/item/clothing/mask/smokable/cigarette/cig = locate() in src
if(cig == null)
user << "<span class='notice'>Looks like the packet is out of cigarettes.</span>"
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 << "<span class='notice'>You take a cigarette out of the pack.</span>"
update_icon()
else
@@ -248,21 +261,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 << "<span class='notice'>You take a cigar out of the case.</span>"
update_icon()
else
..()
/*
* Vial Box
*/
@@ -278,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
@@ -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
@@ -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
@@ -15,14 +15,13 @@
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
/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
@@ -15,9 +15,15 @@
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_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 << "<span class='notice'>[src] is full, make some space.</span>"
return 0 //Storage item is full
@@ -249,9 +320,9 @@
usr << "<span class='notice'>[src] cannot hold [W].</span>"
return 0
if (W.w_class > max_w_class)
if (max_w_class != null && W.w_class > max_w_class)
if(!stop_messages)
usr << "<span class='notice'>[W] is too big for this [src].</span>"
usr << "<span class='notice'>[W] is too long for \the [src].</span>"
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 << "<span class='notice'>[src] is full, make some space.</span>"
usr << "<span class='notice'>[src] is too full, make some space.</span>"
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
@@ -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")
@@ -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()
..()
+2 -1
View File
@@ -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)