mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2026-08-21 12:16:44 +01:00
A lot of new defines are now in inventory_sizes.dm, which contains; All the size identifiers (the thing that tells the game if something is bulky, or w/e). Storage costs for all the sizes, which are exponents of two, as previously. A few constants for inventory size. Also changes all storage item's capacity definitions by basing it off of how many 'normal slots' exist for it. This allows one to change the definition for all of the defines in the file, and everything will follow along without needing to change 500 files. In testing, I made all ITEMSIZE_COST_* defines doubled, and nothing had broke. The benefit of doing all of this is that it makes adding new weight classes in the future much simpler, and makes knowing how much space a container has easier, as seeing ITEMSIZE_COST_NORMAL * 7 means it can hold seven normal items.
250 lines
7.5 KiB
Plaintext
250 lines
7.5 KiB
Plaintext
/*
|
|
* These absorb the functionality of the plant bag, ore satchel, etc.
|
|
* They use the use_to_pickup, quick_gather, and quick_empty functions
|
|
* that were already defined in weapon/storage, but which had been
|
|
* re-implemented in other classes.
|
|
*
|
|
* Contains:
|
|
* Trash Bag
|
|
* Mining Satchel
|
|
* Plant Bag
|
|
* Sheet Snatcher
|
|
* Cash Bag
|
|
*
|
|
* -Sayu
|
|
*/
|
|
|
|
// Generic non-item
|
|
/obj/item/weapon/storage/bag
|
|
allow_quick_gather = 1
|
|
allow_quick_empty = 1
|
|
display_contents_with_number = 0 // UNStABLE AS FuCK, turn on when it stops crashing clients
|
|
use_to_pickup = 1
|
|
slot_flags = SLOT_BELT
|
|
|
|
// -----------------------------
|
|
// Trash bag
|
|
// -----------------------------
|
|
/obj/item/weapon/storage/bag/trash
|
|
name = "trash bag"
|
|
desc = "It's the heavy-duty black polymer kind. Time to take out the trash!"
|
|
icon = 'icons/obj/janitor.dmi'
|
|
icon_state = "trashbag0"
|
|
item_state_slots = list(slot_r_hand_str = "trashbag", slot_l_hand_str = "trashbag")
|
|
|
|
w_class = ITEMSIZE_LARGE
|
|
max_w_class = ITEMSIZE_SMALL
|
|
can_hold = list() // any
|
|
cant_hold = list(/obj/item/weapon/disk/nuclear)
|
|
|
|
/obj/item/weapon/storage/bag/trash/update_icon()
|
|
if(contents.len == 0)
|
|
icon_state = "trashbag0"
|
|
else if(contents.len < 12)
|
|
icon_state = "trashbag1"
|
|
else if(contents.len < 21)
|
|
icon_state = "trashbag2"
|
|
else icon_state = "trashbag3"
|
|
|
|
|
|
// -----------------------------
|
|
// Plastic Bag
|
|
// -----------------------------
|
|
|
|
/obj/item/weapon/storage/bag/plasticbag
|
|
name = "plastic bag"
|
|
desc = "It's a very flimsy, very noisy alternative to a bag."
|
|
icon = 'icons/obj/trash.dmi'
|
|
icon_state = "plasticbag"
|
|
|
|
w_class = ITEMSIZE_LARGE
|
|
max_w_class = ITEMSIZE_SMALL
|
|
can_hold = list() // any
|
|
cant_hold = list(/obj/item/weapon/disk/nuclear)
|
|
|
|
// -----------------------------
|
|
// Mining Satchel
|
|
// -----------------------------
|
|
|
|
/obj/item/weapon/storage/bag/ore
|
|
name = "mining satchel"
|
|
desc = "This little bugger can be used to store and transport ores."
|
|
icon = 'icons/obj/mining.dmi'
|
|
icon_state = "satchel"
|
|
slot_flags = SLOT_BELT | SLOT_POCKET
|
|
w_class = ITEMSIZE_NORMAL
|
|
max_storage_space = ITEMSIZE_COST_NORMAL * 25
|
|
max_w_class = ITEMSIZE_NORMAL
|
|
can_hold = list(/obj/item/weapon/ore)
|
|
|
|
|
|
// -----------------------------
|
|
// Plant bag
|
|
// -----------------------------
|
|
|
|
/obj/item/weapon/storage/bag/plants
|
|
name = "plant bag"
|
|
icon = 'icons/obj/hydroponics_machines.dmi'
|
|
icon_state = "plantbag"
|
|
max_storage_space = ITEMSIZE_COST_NORMAL * 25
|
|
max_w_class = ITEMSIZE_NORMAL
|
|
w_class = ITEMSIZE_SMALL
|
|
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown)
|
|
|
|
|
|
// -----------------------------
|
|
// Sheet Snatcher
|
|
// -----------------------------
|
|
// Because it stacks stacks, this doesn't operate normally.
|
|
// However, making it a storage/bag allows us to reuse existing code in some places. -Sayu
|
|
|
|
/obj/item/weapon/storage/bag/sheetsnatcher
|
|
name = "sheet snatcher"
|
|
icon = 'icons/obj/mining.dmi'
|
|
icon_state = "sheetsnatcher"
|
|
desc = "A patented storage system designed for any kind of mineral sheet."
|
|
|
|
var/capacity = 300; //the number of sheets it can carry.
|
|
w_class = ITEMSIZE_NORMAL
|
|
storage_slots = 7
|
|
|
|
allow_quick_empty = 1 // this function is superceded
|
|
New()
|
|
..()
|
|
//verbs -= /obj/item/weapon/storage/verb/quick_empty
|
|
//verbs += /obj/item/weapon/storage/bag/sheetsnatcher/quick_empty
|
|
|
|
can_be_inserted(obj/item/W as obj, stop_messages = 0)
|
|
if(!istype(W,/obj/item/stack/material))
|
|
if(!stop_messages)
|
|
usr << "The snatcher does not accept [W]."
|
|
return 0
|
|
var/current = 0
|
|
for(var/obj/item/stack/material/S in contents)
|
|
current += S.amount
|
|
if(capacity == current)//If it's full, you're done
|
|
if(!stop_messages)
|
|
usr << "<span class='warning'>The snatcher is full.</span>"
|
|
return 0
|
|
return 1
|
|
|
|
|
|
// Modified handle_item_insertion. Would prefer not to, but...
|
|
handle_item_insertion(obj/item/W as obj, prevent_warning = 0)
|
|
var/obj/item/stack/material/S = W
|
|
if(!istype(S)) return 0
|
|
|
|
var/amount
|
|
var/inserted = 0
|
|
var/current = 0
|
|
for(var/obj/item/stack/material/S2 in contents)
|
|
current += S2.amount
|
|
if(capacity < current + S.amount)//If the stack will fill it up
|
|
amount = capacity - current
|
|
else
|
|
amount = S.amount
|
|
|
|
for(var/obj/item/stack/material/sheet in contents)
|
|
if(S.type == sheet.type) // we are violating the amount limitation because these are not sane objects
|
|
sheet.amount += amount // they should only be removed through procs in this file, which split them up.
|
|
S.amount -= amount
|
|
inserted = 1
|
|
break
|
|
|
|
if(!inserted || !S.amount)
|
|
usr.remove_from_mob(S)
|
|
usr.update_icons() //update our overlays
|
|
if (usr.client && usr.s_active != src)
|
|
usr.client.screen -= S
|
|
S.dropped(usr)
|
|
if(!S.amount)
|
|
qdel(S)
|
|
else
|
|
S.loc = src
|
|
|
|
orient2hud(usr)
|
|
if(usr.s_active)
|
|
usr.s_active.show_to(usr)
|
|
update_icon()
|
|
return 1
|
|
|
|
// Sets up numbered display to show the stack size of each stored mineral
|
|
// NOTE: numbered display is turned off currently because it's broken
|
|
orient2hud(mob/user as mob)
|
|
var/adjusted_contents = contents.len
|
|
|
|
//Numbered contents display
|
|
var/list/datum/numbered_display/numbered_contents
|
|
if(display_contents_with_number)
|
|
numbered_contents = list()
|
|
adjusted_contents = 0
|
|
for(var/obj/item/stack/material/I in contents)
|
|
adjusted_contents++
|
|
var/datum/numbered_display/D = new/datum/numbered_display(I)
|
|
D.number = I.amount
|
|
numbered_contents.Add( D )
|
|
|
|
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
|
|
|
|
|
|
// Modified quick_empty verb drops appropriate sized stacks
|
|
quick_empty()
|
|
var/location = get_turf(src)
|
|
for(var/obj/item/stack/material/S in contents)
|
|
while(S.amount)
|
|
var/obj/item/stack/material/N = new S.type(location)
|
|
var/stacksize = min(S.amount,N.max_amount)
|
|
N.amount = stacksize
|
|
S.amount -= stacksize
|
|
if(!S.amount)
|
|
qdel(S) // todo: there's probably something missing here
|
|
orient2hud(usr)
|
|
if(usr.s_active)
|
|
usr.s_active.show_to(usr)
|
|
update_icon()
|
|
|
|
// Instead of removing
|
|
remove_from_storage(obj/item/W as obj, atom/new_location)
|
|
var/obj/item/stack/material/S = W
|
|
if(!istype(S)) return 0
|
|
|
|
//I would prefer to drop a new stack, but the item/attack_hand code
|
|
// that calls this can't recieve a different object than you clicked on.
|
|
//Therefore, make a new stack internally that has the remainder.
|
|
// -Sayu
|
|
|
|
if(S.amount > S.max_amount)
|
|
var/obj/item/stack/material/temp = new S.type(src)
|
|
temp.amount = S.amount - S.max_amount
|
|
S.amount = S.max_amount
|
|
|
|
return ..(S,new_location)
|
|
|
|
// -----------------------------
|
|
// Sheet Snatcher (Cyborg)
|
|
// -----------------------------
|
|
|
|
/obj/item/weapon/storage/bag/sheetsnatcher/borg
|
|
name = "sheet snatcher 9000"
|
|
desc = ""
|
|
capacity = 500//Borgs get more because >specialization
|
|
|
|
// -----------------------------
|
|
// Cash Bag
|
|
// -----------------------------
|
|
|
|
/obj/item/weapon/storage/bag/cash
|
|
name = "cash bag"
|
|
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 = ITEMSIZE_COST_NORMAL * 25
|
|
max_w_class = ITEMSIZE_NORMAL
|
|
w_class = ITEMSIZE_SMALL
|
|
can_hold = list(/obj/item/weapon/coin,/obj/item/weapon/spacecash)
|