mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-19 13:35:10 +00:00
## About The Pull Request Massively overhauls and standardizes the nuclear operative uplink. ### Weapon Kits Essentially, all the main weapons of the uplink have been changed to instead come as 'weapon kits', which are essentially cases containing a weapon loadout to enable operatives to easily start operating on only just one item purchase, without the fuss of worrying whether or not operatives are getting spare ammo, or getting relevant equipment for success. Consider this a pseudo-loadout, though without necessarily restricting the purchasing of more weapon kits. All kits come in three categories: Low Cost (8 TC), Medium Cost (14 TC) and High Cost (18 TC). This is also matched by categorized ammo costs; Basic Ammo (2 TC), Hollow Point and Armour Penetrating (4 TC), Incendiary (3 TC) and Special (or anything that does not easily fit these categories and does something real extra) (5 TC). Weapons that lacked these ammos have gained these ammo types to fill the gaps. <details> There is may one exception to this in disruptor ammo, which is priced as basic ammo if only because it isn't _quite_ good enough to justify pricing at 5 tc and I can see an op wanting to use it as a basic ammo type instead of normal .50 BMG against, say, a silicon/mech heavy opposition. Since it cannot kill organics on its own, I'll consider this mostly basic-adjacent </details> The kits have also been labelled based on potential difficulty. This reflects possible difficulties in using the item, how conducive it is to success for how much game knowledge needed to actually use it, and how likely an op is to succeed using it. I don't expect ops to win using nothing but a rocket launcher, but I think ops should get a fair shake at trying, yeah? The kits are as below: #### **Low-Cost** _Bulldog (Moderate):_ Shotgun and three magazines of standard ammo. _Ansem (Easy/Spare):_ Pistol and three spare magazines of standard ammo. #### **Medium Cost** _C-20r (Easy):_ SMG and three spare magazines of standard ammo. _Energy Sword and Shield (Very Hard):_ Energy sword and shield. (Also a special hat) _Revolver (Moderate):_ Revolver and three speedloaders of standard ammo. _Rocket Launcher (Hard):_ Rocket launcher with three spare rockets. #### **High Cost** _L6 SAW (Moderate):_ LMG, and that's it. No spare ammo. _M-90gl (Hard):_ Rifle, two spare magazines of standard ammo and a box of rubber grenades. _Sniper (Hard):_ Sniper rifle, two spare magazine of standard ammo, and one magazine of disruptor ammo. Also suit and tie. _CQC (Very Hard):_ Comes with a stealth implant and a bandana. _Double-Energy Sword (Very Hard):_ Double-energy sword, syndicate soap, antislip module, meth injector and a prisoner jumpsuit. _**NEW** Grenadier's Kit (Hard):_ Grenadier's belt and grenade launcher (the one that launchers chem grenades). (I replaced the shit acid grenade with another flashbang in the belt) Surplus SMG (Flukie difficulty) has been unchanged. It just now comes with two rations. Includes two new revolver ammo types: Phasic, which goes through walls and armor, but has significantly less damage as a result (I've equalized the revolver damage and the rifle version's damage to 30 for both). And Heartseeker, which has homing bullets. Both are Special ammo, and are priced at 5 TC a speedloader. ### Other Gear The other items in the uplink have also been consolidated and standardized in various ways. #### Grenades Most now cost 15 TC for three grenades of any given type (including the full fungal tuberculous). This is pretty much identical to the previous price, just more consistent overall and front-loaded in cost. #### Reinforcements All the various reinforcements now cost 35 TC and all refundable, equalizing cost to the average across the reinforcements. This is primarily because I feel like all these options should be weighed equally, and not one of these options are necessarily worse or better than the other in their current balance. They're largely inaccessible for normal ops regardless, and typically come out when there is a discount or war ops. I took the average value and went with it. Not much more to say. #### Mechs They're just cheaper. These things still suck and they need help. They've always needed help. A slightly less excessive value for the mechs may help see people willing to spend the TC on them. I doubt it. I seriously suggest not buying these still. I keep them in primarily because they are big stompy mechs and are kind of iconic 'war ops' gear. #### Bundles Since I've implemented weapon kits, gun bundles are rather redundant. So the bulldog weapon and ammo bundle, the c20-r weapon and ammo bundle and technically the sniper bundle were removed. The sniper bundle is now the weapon kit, obviously. Nothing else here really. Except for one.... #### Implants Not much changed here. I standardized the implant prices to 8 TC a pop. This is in accordance with traitor implants, which ops also get. So everything in this category bar a few exceptions (like macro/microbombs) are around 8 TC. Makes sense to me, really. Importantly, I made the Implant bundle 25 TC, and I unrandomized the contents. Who in the right fucking mind would spend 40 TC just to get five reviver implants is beyond me. But instead, you get one of each of the cybernetic implants except thermal eyes (you can just buy thermals and get the benefit of both vision types; x-ray and thermal vision, if you want to use smokescreens a lot). #### Base Keys They're all now 15 TC, except the fridge which is 5 TC. It's weird they're valued differently when they are taken mostly to do gimmicks like xenobio and toxins in a hurry before hitting the station. So we've standardized it. ## Hat Crate **YES, GOOD SIR, YOU TOO CAN ORDER A HAT CRATE FROM THE SYNDICATE STORE FOR ONLY 5 TC!** **NO NEED FOR A KEY, JUST BUY IT AND PULL IT OPEN WITH YOUR STANDARD ISSUE CROWBAR!** **ENJOY YOUR NEW CRATE! ENJOY YOUR NEW HAT!** **PUT IT ON USING THE FREE HAT STABILIZERS WE INCLUDED WITH THE HATS!** ~~**NO REFUNDS IF YOU GET BLOOD ON YOUR HAT!**~~ <details> There is a 1% chance to instagib people with direct hits from a rocket. This does the crit effect. </details> ## Why It's Good For The Game The uplink needed more spring cleaning and standardization. With this, I've partially implemented my older idea for ammo consistency and initial allowance for nukies. Ammo is kind of over-priced and often where a good chunk of TC goes towards without really pushing nukies towards meaningful success. And it is often what is tripping up new players who didn't think to get any. Now, when they get a gun, they get ammo in their case. On top of this, the weapon kit category is both at the top of the uplink AND has a little label to say 'Recommend', so that these new players will hopefully know they should be looking there first. In addition, it is the gateway towards a concept that is currently being worked on. Nuclear operatives having some degree of predefined loadouts for players to select if they aren't sure what they want, or don't know what to get. Nukies is very confusing for many players. So giving them a fighting chance with some premade setups can help ease them into the role without needing too much player knowledge in how to apply the items. This is only one step towards that, so that players can identify what gear they need to help succeed based on their skill. I wanted to implement a difficulty warning so that players can choose gear loadouts that are actually conducive to their skill and knowledge. I based it on how much players would need to know to engage in combat with it, and how much fiddling is required to get something to work properly (overly involved reloading is a consideration, for example, as well as precise button presses). In addition, how much of a force multiplier some weapons can be for their ease of use. Most people recognize the c20-r as the most new player friendly weapon, as an example. So it would be good to steer players towards taking that gun because of how easy it is to use, understand and succeed with it. And most importantly of all; Having standards within the uplink is important. Most of the values in the uplink are just completely random. Nobody has a good grasp of what is too much or too little. Even just a hint of consistency, and people will stick to it (see implants for what I mean). And there is still some work to be done even there. A good start is weapons. Price for power can be meaningful when decided whether we want some weapons to come out more often than others. Players do enjoy making informed decisions and choices, and having affordability be a draw to some otherwise less powerful weapons (looking at you, Bulldog) can actually be a worthwhile and meaningful difference. ~~I thought it would tick off the gun nerds to change the calibers on the guns.~~ ~~I also thought adding hats would be funny given the release of TF2's most recent update.~~ ## Changelog 🆑 balance: Standardizes some of the nuclear operative entries to have more consistent pricing within their respective categories. add: Adds some new categories so that players have an easier time navigating the nuclear operative uplink. balance: Many items have had prices reduced or adjusted to make them more desirable or more consistent within their category. add: Weapon kits have replaced almost all the individual weapons in the uplink. You now buy these instead of the individual weapon. These often come with spare ammo or relevant gear for success. add: Most ammo types have been standardized in price. refactor; Removes a lot of redundant item entry code and tidies up the actual code part of the nuclear uplink so that it is much easier to find things within it. add: Added 40 new cosmetic items to the Syndicate Store. Buy them now from the Hat Crate, only 5 TC! code: Updated the nuclear operative uplink files. /🆑
812 lines
29 KiB
Plaintext
812 lines
29 KiB
Plaintext
/* Backpacks
|
|
* Contains:
|
|
* Backpack
|
|
* Backpack Types
|
|
* Satchel Types
|
|
*/
|
|
|
|
/*
|
|
* Backpack
|
|
*/
|
|
|
|
/obj/item/storage/backpack
|
|
name = "backpack"
|
|
desc = "You wear this on your back and put items into it."
|
|
icon = 'icons/obj/storage/backpack.dmi'
|
|
worn_icon = 'icons/mob/clothing/back/backpack.dmi'
|
|
icon_state = "backpack"
|
|
inhand_icon_state = "backpack"
|
|
lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi'
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
slot_flags = ITEM_SLOT_BACK //ERROOOOO
|
|
resistance_flags = NONE
|
|
max_integrity = 300
|
|
storage_type = /datum/storage/backpack
|
|
|
|
/obj/item/storage/backpack/Initialize(mapload)
|
|
. = ..()
|
|
AddElement(/datum/element/attack_equip)
|
|
|
|
/*
|
|
* Backpack Types
|
|
*/
|
|
|
|
/obj/item/storage/backpack/old/Initialize(mapload)
|
|
. = ..()
|
|
atom_storage.max_total_storage = 12
|
|
|
|
/obj/item/bag_of_holding_inert
|
|
name = "inert bag of holding"
|
|
desc = "What is currently a just an unwieldly block of metal with a slot ready to accept a bluespace anomaly core."
|
|
icon = 'icons/obj/storage/backpack.dmi'
|
|
worn_icon = 'icons/mob/clothing/back/backpack.dmi'
|
|
icon_state = "bag_of_holding-inert"
|
|
inhand_icon_state = "brokenpack"
|
|
lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi'
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
resistance_flags = FIRE_PROOF
|
|
item_flags = NO_MAT_REDEMPTION
|
|
|
|
/obj/item/storage/backpack/holding
|
|
name = "bag of holding"
|
|
desc = "A backpack that opens into a localized pocket of bluespace."
|
|
icon_state = "bag_of_holding"
|
|
inhand_icon_state = "holdingpack"
|
|
resistance_flags = FIRE_PROOF
|
|
item_flags = NO_MAT_REDEMPTION
|
|
armor_type = /datum/armor/backpack_holding
|
|
storage_type = /datum/storage/bag_of_holding
|
|
|
|
/datum/armor/backpack_holding
|
|
fire = 60
|
|
acid = 50
|
|
|
|
/obj/item/storage/backpack/holding/suicide_act(mob/living/user)
|
|
user.visible_message(span_suicide("[user] is jumping into [src]! It looks like [user.p_theyre()] trying to commit suicide."))
|
|
user.dropItemToGround(src, TRUE)
|
|
user.Stun(100, ignore_canstun = TRUE)
|
|
sleep(2 SECONDS)
|
|
playsound(src, SFX_RUSTLE, 50, TRUE, -5)
|
|
user.suicide_log()
|
|
qdel(user)
|
|
|
|
|
|
/obj/item/storage/backpack/santabag
|
|
name = "Santa's Gift Bag"
|
|
desc = "Space Santa uses this to deliver presents to all the nice children in space in Christmas! Wow, it's pretty big!"
|
|
icon_state = "giftbag0"
|
|
inhand_icon_state = "giftbag"
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
|
|
/obj/item/storage/backpack/santabag/Initialize(mapload)
|
|
. = ..()
|
|
regenerate_presents()
|
|
|
|
/obj/item/storage/backpack/santabag/suicide_act(mob/living/user)
|
|
user.visible_message(span_suicide("[user] places [src] over [user.p_their()] head and pulls it tight! It looks like [user.p_they()] [user.p_are()]n't in the Christmas spirit..."))
|
|
return OXYLOSS
|
|
|
|
/obj/item/storage/backpack/santabag/proc/regenerate_presents()
|
|
addtimer(CALLBACK(src, PROC_REF(regenerate_presents)), 30 SECONDS)
|
|
|
|
var/mob/user = get(loc, /mob)
|
|
if(!istype(user))
|
|
return
|
|
if(HAS_MIND_TRAIT(user, TRAIT_CANNOT_OPEN_PRESENTS))
|
|
var/turf/floor = get_turf(src)
|
|
var/obj/item/thing = new /obj/item/a_gift/anything(floor)
|
|
if(!atom_storage.attempt_insert(thing, user, override = TRUE, force = STORAGE_SOFT_LOCKED))
|
|
qdel(thing)
|
|
|
|
|
|
/obj/item/storage/backpack/cultpack
|
|
name = "trophy rack"
|
|
desc = "It's useful for both carrying extra gear and proudly declaring your insanity."
|
|
icon_state = "backpack-cult"
|
|
inhand_icon_state = "backpack"
|
|
alternate_worn_layer = ABOVE_BODY_FRONT_HEAD_LAYER
|
|
|
|
/obj/item/storage/backpack/clown
|
|
name = "Giggles von Honkerton"
|
|
desc = "It's a backpack made by Honk! Co."
|
|
icon_state = "backpack-clown"
|
|
inhand_icon_state = "clownpack"
|
|
|
|
/obj/item/storage/backpack/explorer
|
|
name = "explorer bag"
|
|
desc = "A robust backpack for stashing your loot."
|
|
icon_state = "backpack-explorer"
|
|
inhand_icon_state = "explorerpack"
|
|
|
|
/obj/item/storage/backpack/mime
|
|
name = "Parcel Parceaux"
|
|
desc = "A silent backpack made for those silent workers. Silence Co."
|
|
icon_state = "backpack-mime"
|
|
inhand_icon_state = "mimepack"
|
|
|
|
/obj/item/storage/backpack/medic
|
|
name = "medical backpack"
|
|
desc = "It's a backpack especially designed for use in a sterile environment."
|
|
icon_state = "backpack-medical"
|
|
inhand_icon_state = "medicalpack"
|
|
|
|
/obj/item/storage/backpack/coroner
|
|
name = "coroner backpack"
|
|
desc = "It's a backpack especially designed for use in an undead environment."
|
|
icon_state = "backpack-coroner"
|
|
inhand_icon_state = "coronerpack"
|
|
|
|
/obj/item/storage/backpack/security
|
|
name = "security backpack"
|
|
desc = "It's a very robust backpack."
|
|
icon_state = "backpack-security"
|
|
inhand_icon_state = "securitypack"
|
|
|
|
/obj/item/storage/backpack/captain
|
|
name = "captain's backpack"
|
|
desc = "It's a special backpack made exclusively for Nanotrasen officers."
|
|
icon_state = "backpack-captain"
|
|
inhand_icon_state = "captainpack"
|
|
|
|
/obj/item/storage/backpack/industrial
|
|
name = "industrial backpack"
|
|
desc = "It's a tough backpack for the daily grind of station life."
|
|
icon_state = "backpack-engineering"
|
|
inhand_icon_state = "engiepack"
|
|
resistance_flags = FIRE_PROOF
|
|
|
|
/obj/item/storage/backpack/botany
|
|
name = "botany backpack"
|
|
desc = "It's a backpack made of all-natural fibers."
|
|
icon_state = "backpack-hydroponics"
|
|
inhand_icon_state = "botpack"
|
|
|
|
/obj/item/storage/backpack/chemistry
|
|
name = "chemistry backpack"
|
|
desc = "A backpack specially designed to repel stains and hazardous liquids."
|
|
icon_state = "backpack-chemistry"
|
|
inhand_icon_state = "chempack"
|
|
|
|
/obj/item/storage/backpack/genetics
|
|
name = "genetics backpack"
|
|
desc = "A bag designed to be super tough, just in case someone hulks out on you."
|
|
icon_state = "backpack-genetics"
|
|
inhand_icon_state = "genepack"
|
|
|
|
/obj/item/storage/backpack/science
|
|
name = "science backpack"
|
|
desc = "A specially designed backpack. It's fire resistant and smells vaguely of plasma."
|
|
icon_state = "backpack-science"
|
|
inhand_icon_state = "scipack"
|
|
|
|
/obj/item/storage/backpack/virology
|
|
name = "virology backpack"
|
|
desc = "A backpack made of hypo-allergenic fibers. It's designed to help prevent the spread of disease. Smells like monkey."
|
|
icon_state = "backpack-virology"
|
|
inhand_icon_state = "viropack"
|
|
|
|
/obj/item/storage/backpack/ert
|
|
name = "emergency response team commander backpack"
|
|
desc = "A spacious backpack with lots of pockets, worn by the Commander of an Emergency Response Team."
|
|
icon_state = "ert_commander"
|
|
inhand_icon_state = "securitypack"
|
|
resistance_flags = FIRE_PROOF
|
|
|
|
/obj/item/storage/backpack/ert/security
|
|
name = "emergency response team security backpack"
|
|
desc = "A spacious backpack with lots of pockets, worn by Security Officers of an Emergency Response Team."
|
|
icon_state = "ert_security"
|
|
|
|
/obj/item/storage/backpack/ert/medical
|
|
name = "emergency response team medical backpack"
|
|
desc = "A spacious backpack with lots of pockets, worn by Medical Officers of an Emergency Response Team."
|
|
icon_state = "ert_medical"
|
|
|
|
/obj/item/storage/backpack/ert/engineer
|
|
name = "emergency response team engineer backpack"
|
|
desc = "A spacious backpack with lots of pockets, worn by Engineers of an Emergency Response Team."
|
|
icon_state = "ert_engineering"
|
|
|
|
/obj/item/storage/backpack/ert/janitor
|
|
name = "emergency response team janitor backpack"
|
|
desc = "A spacious backpack with lots of pockets, worn by Janitors of an Emergency Response Team."
|
|
icon_state = "ert_janitor"
|
|
|
|
/obj/item/storage/backpack/ert/clown
|
|
name = "emergency response team clown backpack"
|
|
desc = "A spacious backpack with lots of pockets, worn by Clowns of an Emergency Response Team."
|
|
icon_state = "ert_clown"
|
|
|
|
/obj/item/storage/backpack/saddlepack
|
|
name = "saddlepack"
|
|
desc = "A backpack designed to be saddled on a mount or carried on your back, and switch between the two on the fly. It's quite spacious, at the cost of making you feel like a literal pack mule."
|
|
icon = 'icons/obj/storage/ethereal.dmi'
|
|
worn_icon = 'icons/mob/clothing/back/ethereal.dmi'
|
|
icon_state = "saddlepack"
|
|
|
|
/obj/item/storage/backpack/saddlepack/Initialize(mapload)
|
|
. = ..()
|
|
atom_storage.max_total_storage = 26
|
|
|
|
// MEAT MEAT MEAT MEAT MEAT
|
|
|
|
/obj/item/storage/backpack/meat
|
|
name = "\improper MEAT"
|
|
desc = "MEAT MEAT MEAT MEAT MEAT MEAT"
|
|
icon_state = "meatmeatmeat"
|
|
inhand_icon_state = "meatmeatmeat"
|
|
force = 15
|
|
throwforce = 15
|
|
attack_verb_continuous = list("MEATS", "MEAT MEATS")
|
|
attack_verb_simple = list("MEAT", "MEAT MEAT")
|
|
///Sounds used in the squeak component
|
|
var/list/meat_sounds = list('sound/effects/blobattack.ogg' = 1)
|
|
///Reagents added to the edible component, ingested when you EAT the MEAT
|
|
var/list/meat_reagents = list(
|
|
/datum/reagent/consumable/nutriment/protein = 10,
|
|
/datum/reagent/consumable/nutriment/vitamin = 10,
|
|
)
|
|
///The food types of the edible component
|
|
var/foodtypes = MEAT | RAW
|
|
///How our MEAT tastes. It tastes like MEAT
|
|
var/list/tastes = list("MEAT" = 1)
|
|
///Eating verbs when consuming the MEAT
|
|
var/list/eatverbs = list("MEAT", "absorb", "gnaw", "consume")
|
|
|
|
/obj/item/storage/backpack/meat/Initialize(mapload)
|
|
. = ..()
|
|
AddComponent(/datum/component/edible,\
|
|
initial_reagents = meat_reagents,\
|
|
foodtypes = foodtypes,\
|
|
tastes = tastes,\
|
|
eatverbs = eatverbs,\
|
|
)
|
|
AddComponent(/datum/component/squeak, meat_sounds)
|
|
|
|
/*
|
|
* Satchel Types
|
|
*/
|
|
|
|
/obj/item/storage/backpack/satchel
|
|
name = "satchel"
|
|
desc = "A trendy looking satchel."
|
|
icon_state = "satchel-norm"
|
|
inhand_icon_state = "satchel-norm"
|
|
|
|
/obj/item/storage/backpack/satchel/leather
|
|
name = "leather satchel"
|
|
desc = "It's a very fancy satchel made with fine leather."
|
|
icon_state = "satchel-leather"
|
|
inhand_icon_state = "satchel"
|
|
|
|
/obj/item/storage/backpack/satchel/leather/withwallet/PopulateContents()
|
|
new /obj/item/storage/wallet/random(src)
|
|
|
|
/obj/item/storage/backpack/satchel/fireproof
|
|
resistance_flags = FIRE_PROOF
|
|
|
|
/obj/item/storage/backpack/satchel/eng
|
|
name = "industrial satchel"
|
|
desc = "A tough satchel with extra pockets."
|
|
icon_state = "satchel-engineering"
|
|
inhand_icon_state = "satchel-eng"
|
|
resistance_flags = FIRE_PROOF
|
|
|
|
/obj/item/storage/backpack/satchel/med
|
|
name = "medical satchel"
|
|
desc = "A sterile satchel used in medical departments."
|
|
icon_state = "satchel-medical"
|
|
inhand_icon_state = "satchel-med"
|
|
|
|
/obj/item/storage/backpack/satchel/vir
|
|
name = "virologist satchel"
|
|
desc = "A sterile satchel with virologist colours."
|
|
icon_state = "satchel-virology"
|
|
inhand_icon_state = "satchel-vir"
|
|
|
|
/obj/item/storage/backpack/satchel/chem
|
|
name = "chemist satchel"
|
|
desc = "A sterile satchel with chemist colours."
|
|
icon_state = "satchel-chemistry"
|
|
inhand_icon_state = "satchel-chem"
|
|
|
|
/obj/item/storage/backpack/satchel/coroner
|
|
name = "coroner satchel"
|
|
desc = "A satchel used to carry whatever's left of human bodies."
|
|
icon_state = "satchel-coroner"
|
|
inhand_icon_state = "satchel-coroner"
|
|
|
|
/obj/item/storage/backpack/satchel/gen
|
|
name = "geneticist satchel"
|
|
desc = "A sterile satchel with geneticist colours."
|
|
icon_state = "satchel-genetics"
|
|
inhand_icon_state = "satchel-gen"
|
|
|
|
/obj/item/storage/backpack/satchel/science
|
|
name = "scientist satchel"
|
|
desc = "Useful for holding research materials."
|
|
icon_state = "satchel-science"
|
|
inhand_icon_state = "satchel-sci"
|
|
|
|
/obj/item/storage/backpack/satchel/hyd
|
|
name = "botanist satchel"
|
|
desc = "A satchel made of all natural fibers."
|
|
icon_state = "satchel-hydroponics"
|
|
inhand_icon_state = "satchel-hyd"
|
|
|
|
/obj/item/storage/backpack/satchel/sec
|
|
name = "security satchel"
|
|
desc = "A robust satchel for security related needs."
|
|
icon_state = "satchel-security"
|
|
inhand_icon_state = "satchel-sec"
|
|
|
|
/obj/item/storage/backpack/satchel/explorer
|
|
name = "explorer satchel"
|
|
desc = "A robust satchel for stashing your loot."
|
|
icon_state = "satchel-explorer"
|
|
inhand_icon_state = "satchel-explorer"
|
|
|
|
/obj/item/storage/backpack/satchel/cap
|
|
name = "captain's satchel"
|
|
desc = "An exclusive satchel for Nanotrasen officers."
|
|
icon_state = "satchel-captain"
|
|
inhand_icon_state = "satchel-cap"
|
|
|
|
/obj/item/storage/backpack/satchel/flat
|
|
name = "smuggler's satchel"
|
|
desc = "A very slim satchel that can easily fit into tight spaces."
|
|
icon_state = "satchel-flat"
|
|
inhand_icon_state = "satchel-flat"
|
|
w_class = WEIGHT_CLASS_NORMAL //Can fit in backpacks itself.
|
|
|
|
/obj/item/storage/backpack/satchel/flat/Initialize(mapload)
|
|
. = ..()
|
|
AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE, INVISIBILITY_OBSERVER, use_anchor = TRUE)
|
|
atom_storage.max_total_storage = 15
|
|
atom_storage.set_holdable(cant_hold_list = list(/obj/item/storage/backpack/satchel/flat)) //muh recursive backpacks)
|
|
|
|
/obj/item/storage/backpack/satchel/flat/PopulateContents()
|
|
for(var/items in 1 to 4)
|
|
new /obj/effect/spawner/random/contraband(src)
|
|
|
|
/obj/item/storage/backpack/satchel/flat/with_tools/PopulateContents()
|
|
new /obj/item/stack/tile/iron/base(src)
|
|
new /obj/item/crowbar(src)
|
|
|
|
..()
|
|
|
|
/obj/item/storage/backpack/satchel/flat/empty/PopulateContents()
|
|
return
|
|
|
|
/obj/item/storage/backpack/duffelbag
|
|
name = "duffel bag"
|
|
desc = "A large duffel bag for holding extra things."
|
|
icon_state = "duffel"
|
|
inhand_icon_state = "duffel"
|
|
actions_types = list(/datum/action/item_action/zipper)
|
|
storage_type = /datum/storage/duffel
|
|
// How much to slow you down if your bag isn't zipped up
|
|
var/zip_slowdown = 1
|
|
/// If this bag is zipped (contents hidden) up or not
|
|
/// Starts enabled so you're forced to interact with it to "get" it
|
|
var/zipped_up = TRUE
|
|
// How much time it takes to zip up (close) the duffelbag
|
|
var/zip_up_duration = 0.5 SECONDS
|
|
// Audio played during zipup
|
|
var/zip_up_sfx = 'sound/items/zip_up.ogg'
|
|
// How much time it takes to unzip the duffel
|
|
var/unzip_duration = 2.1 SECONDS
|
|
// Audio played during unzip
|
|
var/unzip_sfx = 'sound/items/un_zip.ogg'
|
|
|
|
/obj/item/storage/backpack/duffelbag/Initialize(mapload)
|
|
. = ..()
|
|
set_zipper(TRUE)
|
|
|
|
/obj/item/storage/backpack/duffelbag/update_desc(updates)
|
|
. = ..()
|
|
desc = "[initial(desc)]<br>[zipped_up ? "It's zipped up, preventing you from accessing its contents." : "It's unzipped, and harder to move in."]"
|
|
|
|
/obj/item/storage/backpack/duffelbag/attack_self(mob/user, modifiers)
|
|
if(loc != user) // God fuck TK
|
|
return ..()
|
|
if(zipped_up)
|
|
return attack_hand(user, modifiers)
|
|
else
|
|
return attack_hand_secondary(user, modifiers)
|
|
|
|
/obj/item/storage/backpack/duffelbag/attack_self_secondary(mob/user, modifiers)
|
|
attack_self(user, modifiers)
|
|
return ..()
|
|
|
|
// If we're zipped, click to unzip
|
|
/obj/item/storage/backpack/duffelbag/attack_hand(mob/user, list/modifiers)
|
|
if(loc != user)
|
|
// Hacky, but please don't be cringe yeah?
|
|
atom_storage.silent = TRUE
|
|
. = ..()
|
|
atom_storage.silent = initial(atom_storage.silent)
|
|
return
|
|
if(!zipped_up)
|
|
return ..()
|
|
|
|
balloon_alert(user, "unzipping...")
|
|
playsound(src, unzip_sfx, 100, FALSE)
|
|
var/datum/callback/can_unzip = CALLBACK(src, PROC_REF(zipper_matches), TRUE)
|
|
if(!do_after(user, unzip_duration, src, extra_checks = can_unzip))
|
|
user.balloon_alert(user, "unzip failed!")
|
|
return
|
|
balloon_alert(user, "unzipped")
|
|
set_zipper(FALSE)
|
|
return TRUE
|
|
|
|
// Vis versa
|
|
/obj/item/storage/backpack/duffelbag/attack_hand_secondary(mob/user, list/modifiers)
|
|
if(loc != user)
|
|
return ..()
|
|
if(zipped_up)
|
|
return SECONDARY_ATTACK_CALL_NORMAL
|
|
|
|
balloon_alert(user, "zipping...")
|
|
playsound(src, zip_up_sfx, 100, FALSE)
|
|
var/datum/callback/can_zip = CALLBACK(src, PROC_REF(zipper_matches), FALSE)
|
|
if(!do_after(user, zip_up_duration, src, extra_checks = can_zip))
|
|
user.balloon_alert(user, "zip failed!")
|
|
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
|
|
balloon_alert(user, "zipped")
|
|
set_zipper(TRUE)
|
|
return SECONDARY_ATTACK_CONTINUE_CHAIN
|
|
|
|
/// Checks to see if the zipper matches the passed in state
|
|
/// Returns true if so, false otherwise
|
|
/obj/item/storage/backpack/duffelbag/proc/zipper_matches(matching_value)
|
|
return zipped_up == matching_value
|
|
|
|
/obj/item/storage/backpack/duffelbag/proc/set_zipper(new_zip)
|
|
zipped_up = new_zip
|
|
SEND_SIGNAL(src, COMSIG_DUFFEL_ZIP_CHANGE, new_zip)
|
|
if(zipped_up)
|
|
slowdown = initial(slowdown)
|
|
atom_storage.locked = STORAGE_SOFT_LOCKED
|
|
atom_storage.display_contents = FALSE
|
|
atom_storage.close_all()
|
|
else
|
|
slowdown = zip_slowdown
|
|
atom_storage.locked = STORAGE_NOT_LOCKED
|
|
atom_storage.display_contents = TRUE
|
|
|
|
if(isliving(loc))
|
|
var/mob/living/wearer = loc
|
|
wearer.update_equipment_speed_mods()
|
|
update_appearance()
|
|
|
|
/obj/item/storage/backpack/duffelbag/cursed
|
|
name = "living duffel bag"
|
|
desc = "A cursed clown duffel bag that hungers for food of any kind. A warning label suggests that it eats food inside. \
|
|
If that food happens to be a horribly ruined mess or the chef scrapped out of the microwave, or poisoned in some way, \
|
|
then it might have negative effects on the bag..."
|
|
icon_state = "duffel-curse"
|
|
inhand_icon_state = "duffel-curse"
|
|
zip_slowdown = 2
|
|
max_integrity = 100
|
|
|
|
/obj/item/storage/backpack/duffelbag/cursed/Initialize(mapload)
|
|
. = ..()
|
|
AddComponent(/datum/component/curse_of_hunger, add_dropdel = TRUE)
|
|
|
|
/obj/item/storage/backpack/duffelbag/captain
|
|
name = "captain's duffel bag"
|
|
desc = "A large duffel bag for holding extra captainly goods."
|
|
icon_state = "duffel-captain"
|
|
inhand_icon_state = "duffel-captain"
|
|
|
|
/obj/item/storage/backpack/duffelbag/med
|
|
name = "medical duffel bag"
|
|
desc = "A large duffel bag for holding extra medical supplies."
|
|
icon_state = "duffel-medical"
|
|
inhand_icon_state = "duffel-med"
|
|
|
|
/obj/item/storage/backpack/duffelbag/med/surgery
|
|
name = "surgical duffel bag"
|
|
desc = "A large duffel bag for holding extra medical supplies - this one seems to be designed for holding surgical tools."
|
|
|
|
/obj/item/storage/backpack/duffelbag/med/surgery/PopulateContents()
|
|
new /obj/item/scalpel(src)
|
|
new /obj/item/hemostat(src)
|
|
new /obj/item/retractor(src)
|
|
new /obj/item/circular_saw(src)
|
|
new /obj/item/surgicaldrill(src)
|
|
new /obj/item/cautery(src)
|
|
new /obj/item/bonesetter(src)
|
|
new /obj/item/surgical_drapes(src)
|
|
new /obj/item/clothing/mask/surgical(src)
|
|
new /obj/item/razor(src)
|
|
new /obj/item/blood_filter(src)
|
|
|
|
/obj/item/storage/backpack/duffelbag/coroner
|
|
name = "coroner duffel bag"
|
|
desc = "A large duffel bag for holding large amounts of organs at once."
|
|
icon_state = "duffel-coroner"
|
|
inhand_icon_state = "duffel-coroner"
|
|
|
|
/obj/item/storage/backpack/duffelbag/coroner/surgery
|
|
name = "surgical coroner bag"
|
|
desc = "A large duffel bag for holding extra medical supplies - this one seems to be designed for holding morbid surgical tools."
|
|
|
|
/obj/item/storage/backpack/duffelbag/coroner/surgery/PopulateContents()
|
|
new /obj/item/scalpel/cruel(src)
|
|
new /obj/item/hemostat/cruel(src)
|
|
new /obj/item/retractor/cruel(src)
|
|
new /obj/item/circular_saw(src)
|
|
new /obj/item/surgicaldrill(src)
|
|
new /obj/item/cautery/cruel(src)
|
|
new /obj/item/bonesetter(src)
|
|
new /obj/item/surgical_drapes(src)
|
|
new /obj/item/razor(src)
|
|
new /obj/item/blood_filter(src)
|
|
|
|
/obj/item/storage/backpack/duffelbag/explorer
|
|
name = "explorer duffel bag"
|
|
desc = "A large duffel bag for holding extra exotic treasures."
|
|
icon_state = "duffel-explorer"
|
|
inhand_icon_state = "duffel-explorer"
|
|
|
|
/obj/item/storage/backpack/duffelbag/hydroponics
|
|
name = "hydroponic's duffel bag"
|
|
desc = "A large duffel bag for holding extra gardening tools."
|
|
icon_state = "duffel-hydroponics"
|
|
inhand_icon_state = "duffel-hydroponics"
|
|
|
|
/obj/item/storage/backpack/duffelbag/chemistry
|
|
name = "chemistry duffel bag"
|
|
desc = "A large duffel bag for holding extra chemical substances."
|
|
icon_state = "duffel-chemistry"
|
|
inhand_icon_state = "duffel-chemistry"
|
|
|
|
/obj/item/storage/backpack/duffelbag/genetics
|
|
name = "geneticist's duffel bag"
|
|
desc = "A large duffel bag for holding extra genetic mutations."
|
|
icon_state = "duffel-genetics"
|
|
inhand_icon_state = "duffel-genetics"
|
|
|
|
/obj/item/storage/backpack/duffelbag/science
|
|
name = "scientist's duffel bag"
|
|
desc = "A large duffel bag for holding extra scientific components."
|
|
icon_state = "duffel-science"
|
|
inhand_icon_state = "duffel-sci"
|
|
|
|
/obj/item/storage/backpack/duffelbag/virology
|
|
name = "virologist's duffel bag"
|
|
desc = "A large duffel bag for holding extra viral bottles."
|
|
icon_state = "duffel-virology"
|
|
inhand_icon_state = "duffel-virology"
|
|
|
|
/obj/item/storage/backpack/duffelbag/sec
|
|
name = "security duffel bag"
|
|
desc = "A large duffel bag for holding extra security supplies and ammunition."
|
|
icon_state = "duffel-security"
|
|
inhand_icon_state = "duffel-sec"
|
|
|
|
/obj/item/storage/backpack/duffelbag/sec/surgery
|
|
name = "surgical duffel bag"
|
|
desc = "A large duffel bag for holding extra supplies - this one has a material inlay with space for various sharp-looking tools."
|
|
|
|
/obj/item/storage/backpack/duffelbag/sec/surgery/PopulateContents()
|
|
new /obj/item/scalpel(src)
|
|
new /obj/item/hemostat(src)
|
|
new /obj/item/retractor(src)
|
|
new /obj/item/circular_saw(src)
|
|
new /obj/item/bonesetter(src)
|
|
new /obj/item/surgicaldrill(src)
|
|
new /obj/item/cautery(src)
|
|
new /obj/item/surgical_drapes(src)
|
|
new /obj/item/clothing/mask/surgical(src)
|
|
new /obj/item/blood_filter(src)
|
|
|
|
/obj/item/storage/backpack/duffelbag/engineering
|
|
name = "industrial duffel bag"
|
|
desc = "A large duffel bag for holding extra tools and supplies."
|
|
icon_state = "duffel-engineering"
|
|
inhand_icon_state = "duffel-eng"
|
|
resistance_flags = FIRE_PROOF
|
|
|
|
/obj/item/storage/backpack/duffelbag/drone
|
|
name = "drone duffel bag"
|
|
desc = "A large duffel bag for holding tools and hats."
|
|
icon_state = "duffel-drone"
|
|
inhand_icon_state = "duffel-drone"
|
|
resistance_flags = FIRE_PROOF
|
|
|
|
/obj/item/storage/backpack/duffelbag/drone/PopulateContents()
|
|
new /obj/item/screwdriver(src)
|
|
new /obj/item/wrench(src)
|
|
new /obj/item/weldingtool(src)
|
|
new /obj/item/crowbar(src)
|
|
new /obj/item/stack/cable_coil(src)
|
|
new /obj/item/wirecutters(src)
|
|
new /obj/item/multitool(src)
|
|
|
|
/obj/item/storage/backpack/duffelbag/clown
|
|
name = "clown's duffel bag"
|
|
desc = "A large duffel bag for holding lots of funny gags!"
|
|
icon_state = "duffel-clown"
|
|
inhand_icon_state = "duffel-clown"
|
|
|
|
/obj/item/storage/backpack/duffelbag/clown/cream_pie/PopulateContents()
|
|
for(var/i in 1 to 10)
|
|
new /obj/item/food/pie/cream(src)
|
|
|
|
/obj/item/storage/backpack/fireproof
|
|
resistance_flags = FIRE_PROOF
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie
|
|
name = "suspicious looking duffel bag"
|
|
desc = "A large duffel bag for holding extra tactical supplies. It contains an oiled plastitanium zipper for maximum speed tactical zipping, and is better balanced on your back than an average duffelbag. Can hold two bulky items!"
|
|
icon_state = "duffel-syndie"
|
|
inhand_icon_state = "duffel-syndieammo"
|
|
storage_type = /datum/storage/duffel/syndicate
|
|
resistance_flags = FIRE_PROOF
|
|
// Less slowdown while unzipped. Still bulky, but it won't halve your movement speed in an active combat situation.
|
|
zip_slowdown = 0.3
|
|
// Faster unzipping. Utilizes the same noise as zipping up to fit the unzip duration.
|
|
unzip_duration = 0.5 SECONDS
|
|
unzip_sfx = 'sound/items/zip_up.ogg'
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie/hitman
|
|
desc = "A large duffel bag for holding extra things. There is a Nanotrasen logo on the back."
|
|
icon_state = "duffel-syndieammo"
|
|
inhand_icon_state = "duffel-syndieammo"
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie/hitman/PopulateContents()
|
|
new /obj/item/clothing/under/costume/buttondown/slacks/service(src)
|
|
new /obj/item/clothing/neck/tie/red/hitman(src)
|
|
new /obj/item/clothing/accessory/waistcoat(src)
|
|
new /obj/item/clothing/suit/toggle/lawyer/black(src)
|
|
new /obj/item/clothing/shoes/laceup(src)
|
|
new /obj/item/clothing/gloves/color/black(src)
|
|
new /obj/item/clothing/glasses/sunglasses(src)
|
|
new /obj/item/clothing/head/fedora(src)
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie/med
|
|
name = "medical duffel bag"
|
|
desc = "A large duffel bag for holding extra tactical medical supplies."
|
|
icon_state = "duffel-syndiemed"
|
|
inhand_icon_state = "duffel-syndiemed"
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie/surgery
|
|
name = "surgery duffel bag"
|
|
desc = "A suspicious looking duffel bag for holding surgery tools."
|
|
icon_state = "duffel-syndiemed"
|
|
inhand_icon_state = "duffel-syndiemed"
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie/surgery/PopulateContents()
|
|
new /obj/item/scalpel/advanced(src)
|
|
new /obj/item/retractor/advanced(src)
|
|
new /obj/item/cautery/advanced(src)
|
|
new /obj/item/surgical_drapes(src)
|
|
new /obj/item/reagent_containers/medigel/sterilizine(src)
|
|
new /obj/item/bonesetter(src)
|
|
new /obj/item/blood_filter(src)
|
|
new /obj/item/stack/medical/bone_gel(src)
|
|
new /obj/item/stack/sticky_tape/surgical(src)
|
|
new /obj/item/roller(src)
|
|
new /obj/item/clothing/suit/jacket/straight_jacket(src)
|
|
new /obj/item/clothing/mask/muzzle(src)
|
|
new /obj/item/mmi/syndie(src)
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie/ammo
|
|
name = "ammunition duffel bag"
|
|
desc = "A large duffel bag for holding extra weapons ammunition and supplies."
|
|
icon_state = "duffel-syndieammo"
|
|
inhand_icon_state = "duffel-syndieammo"
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie/ammo/mech
|
|
desc = "A large duffel bag, packed to the brim with various exosuit ammo."
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie/ammo/mech/PopulateContents()
|
|
new /obj/item/mecha_ammo/scattershot(src)
|
|
new /obj/item/mecha_ammo/scattershot(src)
|
|
new /obj/item/mecha_ammo/scattershot(src)
|
|
new /obj/item/mecha_ammo/scattershot(src)
|
|
new /obj/item/storage/belt/utility/syndicate(src)
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie/ammo/mauler
|
|
desc = "A large duffel bag, packed to the brim with various exosuit ammo."
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie/ammo/mauler/PopulateContents()
|
|
new /obj/item/mecha_ammo/lmg(src)
|
|
new /obj/item/mecha_ammo/lmg(src)
|
|
new /obj/item/mecha_ammo/lmg(src)
|
|
new /obj/item/mecha_ammo/scattershot(src)
|
|
new /obj/item/mecha_ammo/scattershot(src)
|
|
new /obj/item/mecha_ammo/scattershot(src)
|
|
new /obj/item/mecha_ammo/missiles_srm(src)
|
|
new /obj/item/mecha_ammo/missiles_srm(src)
|
|
new /obj/item/mecha_ammo/missiles_srm(src)
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle
|
|
desc = "A large duffel bag containing a medical equipment, a Donksoft LMG, a big jumbo box of riot darts, and a magboot MODsuit module."
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle/PopulateContents()
|
|
new /obj/item/mod/module/magboot(src)
|
|
new /obj/item/storage/medkit/tactical/premium(src)
|
|
new /obj/item/gun/ballistic/automatic/l6_saw/toy(src)
|
|
new /obj/item/ammo_box/foambox/riot(src)
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle
|
|
desc = "A large duffel bag containing deadly chemicals, a handheld chem sprayer, Bioterror foam grenade, a Donksoft assault rifle, box of riot grade darts, a dart pistol, and a box of syringes."
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle/PopulateContents()
|
|
new /obj/item/reagent_containers/spray/chemsprayer/bioterror(src)
|
|
new /obj/item/storage/box/syndie_kit/chemical(src)
|
|
new /obj/item/gun/syringe/syndicate(src)
|
|
new /obj/item/gun/ballistic/automatic/c20r/toy(src)
|
|
new /obj/item/storage/box/syringes(src)
|
|
new /obj/item/ammo_box/foambox/riot(src)
|
|
new /obj/item/grenade/chem_grenade/bioterrorfoam(src)
|
|
if(prob(5))
|
|
new /obj/item/food/pizza/pineapple(src)
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie/c4/PopulateContents()
|
|
for(var/i in 1 to 10)
|
|
new /obj/item/grenade/c4(src)
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie/x4/PopulateContents()
|
|
for(var/i in 1 to 3)
|
|
new /obj/item/grenade/c4/x4(src)
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie/firestarter
|
|
desc = "A large duffel bag containing a New Russian pyro backpack sprayer, Elite MODsuit, a Stechkin APS pistol, minibomb, ammo, and other equipment."
|
|
|
|
/obj/item/storage/backpack/duffelbag/syndie/firestarter/PopulateContents()
|
|
new /obj/item/clothing/under/syndicate/soviet(src)
|
|
new /obj/item/mod/control/pre_equipped/elite/flamethrower(src)
|
|
new /obj/item/gun/ballistic/automatic/pistol/aps(src)
|
|
new /obj/item/ammo_box/magazine/m9mm_aps/fire(src)
|
|
new /obj/item/ammo_box/magazine/m9mm_aps/fire(src)
|
|
new /obj/item/reagent_containers/cup/glass/bottle/vodka/badminka(src)
|
|
new /obj/item/reagent_containers/hypospray/medipen/stimulants(src)
|
|
new /obj/item/grenade/syndieminibomb(src)
|
|
|
|
// For ClownOps.
|
|
/obj/item/storage/backpack/duffelbag/clown/syndie
|
|
storage_type = /datum/storage/duffel/syndicate
|
|
|
|
/obj/item/storage/backpack/duffelbag/clown/syndie/PopulateContents()
|
|
new /obj/item/modular_computer/pda/clown(src)
|
|
new /obj/item/clothing/under/rank/civilian/clown(src)
|
|
new /obj/item/clothing/shoes/clown_shoes(src)
|
|
new /obj/item/clothing/mask/gas/clown_hat(src)
|
|
new /obj/item/bikehorn(src)
|
|
new /obj/item/implanter/sad_trombone(src)
|
|
|
|
/obj/item/storage/backpack/henchmen
|
|
name = "wings"
|
|
desc = "Granted to the henchmen who deserve it. This probably doesn't include you."
|
|
icon_state = "henchmen"
|
|
inhand_icon_state = null
|
|
|
|
/obj/item/storage/backpack/duffelbag/cops
|
|
name = "police bag"
|
|
desc = "A large duffel bag for holding extra police gear."
|
|
|
|
/obj/item/storage/backpack/duffelbag/mining_conscript
|
|
name = "mining conscription kit"
|
|
desc = "A duffel bag containing everything a crewmember needs to support a shaft miner in the field."
|
|
icon_state = "duffel-explorer"
|
|
inhand_icon_state = "duffel-explorer"
|
|
|
|
/obj/item/storage/backpack/duffelbag/mining_conscript/PopulateContents()
|
|
new /obj/item/clothing/glasses/meson(src)
|
|
new /obj/item/t_scanner/adv_mining_scanner/lesser(src)
|
|
new /obj/item/storage/bag/ore(src)
|
|
new /obj/item/clothing/suit/hooded/explorer(src)
|
|
new /obj/item/encryptionkey/headset_mining(src)
|
|
new /obj/item/clothing/mask/gas/explorer(src)
|
|
new /obj/item/card/id/advanced/mining(src)
|
|
new /obj/item/gun/energy/recharge/kinetic_accelerator(src)
|
|
new /obj/item/knife/combat/survival(src)
|
|
new /obj/item/flashlight/seclite(src)
|