@@ -0,0 +1,222 @@
|
||||
//Moved Maint Loot and other assorted bounties to silly.dm
|
||||
|
||||
/datum/bounty/item/assistant/scooter
|
||||
name = "Scooter"
|
||||
description = "Nanotrasen has determined walking to be wasteful. Ship a scooter to CentCom to speed operations up."
|
||||
reward = 900 // the mat hoffman
|
||||
wanted_types = list(/obj/vehicle/ridden/scooter)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/bounty/item/assistant/skateboard
|
||||
name = "Skateboard"
|
||||
description = "Nanotrasen has determined walking to be wasteful. Ship a skateboard to CentCom to speed operations up."
|
||||
reward = 750 // the tony hawk
|
||||
wanted_types = list(/obj/vehicle/ridden/scooter/skateboard)
|
||||
|
||||
/datum/bounty/item/assistant/stunprod
|
||||
name = "Stunprod"
|
||||
description = "CentCom demands a stunprod to use against dissidents. Craft one, then ship it."
|
||||
reward = 800
|
||||
wanted_types = list(/obj/item/melee/baton/cattleprod)
|
||||
|
||||
/datum/bounty/item/assistant/soap
|
||||
name = "Soap"
|
||||
description = "Soap has gone missing from CentCom's bathrooms and nobody knows who took it. Replace it and be the hero CentCom needs."
|
||||
reward = 1200
|
||||
required_count = 3 //You can (apparently) get soap from the mining rewards vendor.
|
||||
wanted_types = list(/obj/item/soap)
|
||||
|
||||
/datum/bounty/item/assistant/spear
|
||||
name = "Spears"
|
||||
description = "CentCom's security forces are going through budget cuts. You will be paid if you ship a set of spears."
|
||||
reward = 1000
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/item/twohanded/spear)
|
||||
|
||||
/datum/bounty/item/assistant/toolbox
|
||||
name = "Toolboxes"
|
||||
description = "There's an absence of robustness at Central Command. Hurry up and ship some toolboxes as a solution."
|
||||
reward = 1000
|
||||
required_count = 6
|
||||
wanted_types = list(/obj/item/storage/toolbox)
|
||||
|
||||
/datum/bounty/item/assistant/statue
|
||||
name = "Statue"
|
||||
description = "Central Command would like to commision an artsy statue for the lobby. Ship one out, when possible."
|
||||
reward = 2000
|
||||
wanted_types = list(/obj/structure/statue)
|
||||
|
||||
/datum/bounty/item/assistant/cheesiehonkers
|
||||
name = "Cheesie Honkers"
|
||||
description = "Apparently the company that makes Cheesie Honkers is going out of business soon. CentCom wants to stock up before it happens!"
|
||||
reward = 1000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/cheesiehonkers)
|
||||
|
||||
/datum/bounty/item/assistant/baseball_bat
|
||||
name = "Baseball Bat"
|
||||
description = "Baseball fever is going on at CentCom! Be a dear and ship them some baseball bats, so that management can live out their childhood dream."
|
||||
reward = 1000
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/item/melee/baseball_bat)
|
||||
|
||||
/datum/bounty/item/assistant/extendohand
|
||||
name = "Extendo-Hand"
|
||||
description = "Commander Betsy is getting old, and can't bend over to get the telescreen remote anymore. Management has requested an extendo-hand to help her out."
|
||||
reward = 1250
|
||||
wanted_types = list(/obj/item/extendohand)
|
||||
|
||||
// /datum/bounty/item/assistant/donut
|
||||
// name = "Donuts"
|
||||
// description = "CentCom's security forces are facing heavy losses against the Syndicate. Ship donuts to raise morale."
|
||||
// reward = 2000
|
||||
// required_count = 10
|
||||
// wanted_types = list(/obj/item/reagent_containers/food/snacks/donut)
|
||||
|
||||
// /datum/bounty/item/assistant/donkpocket
|
||||
// name = "Donk-Pockets"
|
||||
// description = "Consumer safety recall: Warning. Donk-Pockets manufactured in the past year contain hazardous lizard biomatter. Return units to CentCom immediately."
|
||||
// reward = 1000
|
||||
// required_count = 10
|
||||
// wanted_types = list(/obj/item/reagent_containers/food/snacks/donkpocket)
|
||||
|
||||
/datum/bounty/item/assistant/briefcase
|
||||
name = "Briefcase"
|
||||
description = "Central Command will be holding a business convention this year. Ship a few briefcases in support."
|
||||
reward = 1200
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/storage/briefcase, /obj/item/storage/secure/briefcase)
|
||||
|
||||
/datum/bounty/item/assistant/monkey_hide
|
||||
name = "Monkey Hide"
|
||||
description = "One of the scientists at CentCom is interested in testing products on monkey skin. Your mission is to acquire monkey's hide and ship it."
|
||||
reward = 1250
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/stack/sheet/animalhide/monkey)
|
||||
|
||||
/datum/bounty/item/assistant/shard
|
||||
name = "Shards"
|
||||
description = "A killer clown has been stalking CentCom, and staff have been unable to catch her because she's not wearing shoes. Please ship some shards so that a booby trap can be constructed."
|
||||
reward = 750
|
||||
required_count = 15
|
||||
wanted_types = list(/obj/item/shard)
|
||||
|
||||
/datum/bounty/item/assistant/comfy_chair
|
||||
name = "Comfy Chairs"
|
||||
description = "Commander Pat is unhappy with his chair. He claims it hurts his back. Ship some alternatives out to humor him."
|
||||
reward = 900
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/structure/chair/comfy)
|
||||
|
||||
// /datum/bounty/item/assistant/geranium
|
||||
// name = "Geraniums"
|
||||
// description = "Commander Zot has the hots for Commander Zena. Send a shipment of geraniums - her favorite flower - and he'll happily reward you."
|
||||
// reward = 1000
|
||||
// required_count = 3
|
||||
// wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium)
|
||||
|
||||
// /datum/bounty/item/assistant/poppy
|
||||
// name = "Poppies"
|
||||
// description = "Commander Zot really wants to sweep Security Officer Olivia off her feet. Send a shipment of Poppies - her favorite flower - and he'll happily reward you."
|
||||
// reward = 1000
|
||||
// required_count = 3
|
||||
// wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy)
|
||||
// include_subtypes = FALSE
|
||||
|
||||
/datum/bounty/item/assistant/shadyjims
|
||||
name = "Shady Jim's"
|
||||
description = "There's an irate officer at CentCom demanding that he receive a box of Shady Jim's cigarettes. Please ship one. He's starting to make threats."
|
||||
reward = 750
|
||||
wanted_types = list(/obj/item/storage/fancy/cigarettes/cigpack_shadyjims)
|
||||
|
||||
/datum/bounty/item/assistant/potted_plants
|
||||
name = "Potted Plants"
|
||||
description = "Central Command is looking to commission a new BirdBoat-class station. You've been ordered to supply the potted plants."
|
||||
reward = 2000
|
||||
required_count = 8
|
||||
wanted_types = list(/obj/item/twohanded/required/kirbyplants)
|
||||
|
||||
// /datum/bounty/item/assistant/earmuffs
|
||||
// name = "Earmuffs"
|
||||
// description = "Central Command is getting tired of your station's messages. They've ordered that you ship some earmuffs to lessen the annoyance."
|
||||
// reward = 1000
|
||||
// wanted_types = list(/obj/item/clothing/ears/earmuffs)
|
||||
|
||||
/datum/bounty/item/assistant/cuffs
|
||||
name = "Handcuffs"
|
||||
description = "A large influx of escaped convicts have arrived at Central Command. Now is the perfect time to ship out spare handcuffs (or restraints)."
|
||||
reward = 1000
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/item/restraints/handcuffs)
|
||||
|
||||
/datum/bounty/item/assistant/monkey_cubes
|
||||
name = "Monkey Cubes"
|
||||
description = "Due to a recent genetics accident, Central Command is in serious need of monkeys. Your mission is to ship monkey cubes."
|
||||
reward = 2000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/monkeycube)
|
||||
|
||||
/datum/bounty/item/assistant/chainsaw
|
||||
name = "Chainsaw"
|
||||
description = "The chef at CentCom is having trouble butchering her animals. She requests one chainsaw, please."
|
||||
reward = 2500
|
||||
wanted_types = list(/obj/item/twohanded/required/chainsaw)
|
||||
|
||||
/datum/bounty/item/assistant/ied
|
||||
name = "IED"
|
||||
description = "Nanotrasen's maximum security prison at CentCom is undergoing personnel training. Ship a handful of IEDs to serve as a training tools."
|
||||
reward = 2000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/grenade/iedcasing)
|
||||
|
||||
/datum/bounty/item/assistant/bonfire
|
||||
name = "Lit Bonfire"
|
||||
description = "Space heaters are malfunctioning and the cargo crew of Central Command is starting to feel cold. Ship a lit bonfire to warm them up."
|
||||
reward = 5000
|
||||
wanted_types = list(/obj/structure/bonfire)
|
||||
|
||||
/datum/bounty/item/assistant/bonfire/applies_to(obj/O)
|
||||
if(!..())
|
||||
return FALSE
|
||||
var/obj/structure/bonfire/B = O
|
||||
return !!B.burning
|
||||
|
||||
/datum/bounty/item/assistant/corgimeat
|
||||
name = "Raw Corgi Meat"
|
||||
description = "The Syndicate recently stole all of CentCom's corgi meat. Ship out a replacement immediately."
|
||||
reward = 3000
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi)
|
||||
|
||||
/datum/bounty/item/assistant/tail_whip
|
||||
name = "Nine Tails whip"
|
||||
description = "Commander Jackson is looking for a fine addition to her exotic weapons collection. She will reward you handsomely for either a Cat or Liz o' Nine Tails."
|
||||
reward = 4000
|
||||
wanted_types = list(/obj/item/melee/chainofcommand/tailwhip)
|
||||
|
||||
/datum/bounty/item/assistant/bolas
|
||||
name = "Bolas"
|
||||
description = "Centcom's chef has lost their mind. They're streaking naked though the halls, greased up with butter and cooking oil. Send some bola's so we can capture them."
|
||||
reward = 1000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/restraints/legcuffs/bola)
|
||||
|
||||
/datum/bounty/item/assistant/metalshields
|
||||
name = "Metal Shields"
|
||||
description = "NT is testing the effects of electricity on clowns wielding metal shields. We have clowns, and we have electricity. Send us the shields."
|
||||
reward = 1400
|
||||
required_count = 4
|
||||
wanted_types = list(/obj/item/shield/makeshift)
|
||||
|
||||
/datum/bounty/item/assistant/toolbelts
|
||||
name = "Tool Belts"
|
||||
description = "These things always seem to go missing. Ship us a few to help us restock."
|
||||
reward = 1350
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/storage/belt/utility)
|
||||
|
||||
/datum/bounty/item/assistant/gasmasks
|
||||
name = "Gas Masks"
|
||||
description = "The good news is that we have more miasma than we'll ever need. The bad news is, somone opened the release valve on the canisters. Ship us some gas masks!"
|
||||
reward = 1100
|
||||
required_count = 4
|
||||
wanted_types = list(/obj/item/clothing/mask/gas)
|
||||
@@ -0,0 +1,194 @@
|
||||
/datum/bounty/item/botany
|
||||
reward = 1200
|
||||
var/datum/bounty/item/botany/multiplier = 0 //adds bonus reward money; increased for higher tier or rare mutations
|
||||
var/datum/bounty/item/botany/bonus_desc //for adding extra flavor text to bounty descriptions
|
||||
var/datum/bounty/item/botany/foodtype = "meal" //same here
|
||||
|
||||
/datum/bounty/item/botany/New()
|
||||
..()
|
||||
description = "Central Command's head chef is looking to prepare a fine [foodtype] with [name]. [bonus_desc]"
|
||||
reward += multiplier * 1000
|
||||
required_count = rand(5, 10)
|
||||
|
||||
/datum/bounty/item/botany/ambrosia_vulgaris
|
||||
name = "Ambrosia Vulgaris Leaves"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris)
|
||||
foodtype = "stew"
|
||||
|
||||
/datum/bounty/item/botany/ambrosia_gaia
|
||||
name = "Ambrosia Gaia Leaves"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/ambrosia/gaia)
|
||||
multiplier = 4
|
||||
foodtype = "stew"
|
||||
|
||||
/datum/bounty/item/botany/apple_golden
|
||||
name = "Golden Apples"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/apple/gold)
|
||||
multiplier = 4
|
||||
foodtype = "dessert"
|
||||
|
||||
/datum/bounty/item/botany/banana
|
||||
name = "Bananas"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/banana)
|
||||
exclude_types = list(/obj/item/reagent_containers/food/snacks/grown/banana/bluespace)
|
||||
foodtype = "banana split"
|
||||
|
||||
/datum/bounty/item/botany/banana_bluespace
|
||||
name = "Bluespace Bananas"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/banana/bluespace)
|
||||
multiplier = 2
|
||||
foodtype = "banana split"
|
||||
|
||||
/datum/bounty/item/botany/beans_koi
|
||||
name = "Koi Beans"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/koibeans)
|
||||
multiplier = 2
|
||||
|
||||
/datum/bounty/item/botany/berries_death
|
||||
name = "Death Berries"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/berries/death)
|
||||
multiplier = 2
|
||||
bonus_desc = "He insists that \"he knows what he's doing\"."
|
||||
foodtype = "sorbet"
|
||||
|
||||
/datum/bounty/item/botany/berries_glow
|
||||
name = "Glow-Berries"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/berries/glow)
|
||||
multiplier = 2
|
||||
foodtype = "sorbet"
|
||||
|
||||
/datum/bounty/item/botany/cannabis
|
||||
name = "Cannabis Leaves"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/cannabis)
|
||||
exclude_types = list(/obj/item/reagent_containers/food/snacks/grown/cannabis/white, /obj/item/reagent_containers/food/snacks/grown/cannabis/death, /obj/item/reagent_containers/food/snacks/grown/cannabis/ultimate)
|
||||
multiplier = 4 //hush money
|
||||
bonus_desc = "Do not mention this shipment to security."
|
||||
foodtype = "\"meal\""
|
||||
|
||||
/datum/bounty/item/botany/cannabis_white
|
||||
name = "Lifeweed Leaves"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/cannabis/white)
|
||||
multiplier = 6
|
||||
bonus_desc = "Do not mention this shipment to security."
|
||||
foodtype = "\"meal\""
|
||||
|
||||
/datum/bounty/item/botany/cannabis_death
|
||||
name = "Deathweed Leaves"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/cannabis/death)
|
||||
multiplier = 6
|
||||
bonus_desc = "Do not mention this shipment to security."
|
||||
foodtype = "\"meal\""
|
||||
|
||||
/datum/bounty/item/botany/cannabis_ultimate
|
||||
name = "Omega Weed Leaves"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/cannabis/ultimate)
|
||||
multiplier = 6
|
||||
bonus_desc = "Under no circumstances mention this shipment to security."
|
||||
foodtype = "\"meal\""
|
||||
|
||||
/datum/bounty/item/botany/wheat
|
||||
name = "Wheat Grains"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/wheat)
|
||||
|
||||
/datum/bounty/item/botany/rice
|
||||
name = "Rice Grains"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/rice)
|
||||
|
||||
/datum/bounty/item/botany/chili
|
||||
name = "Chili Peppers"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/chili)
|
||||
|
||||
/datum/bounty/item/botany/chili
|
||||
name = "Ice Chili Peppers"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/icepepper)
|
||||
multiplier = 2
|
||||
|
||||
/datum/bounty/item/botany/chili
|
||||
name = "Ghost Chili Peppers"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/ghost_chili)
|
||||
multiplier = 2
|
||||
|
||||
/datum/bounty/item/botany/citrus_lime
|
||||
name = "Limes"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/citrus/lime)
|
||||
foodtype = "sorbet"
|
||||
|
||||
/datum/bounty/item/botany/citrus_lemon
|
||||
name = "Lemons"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/citrus/lemon)
|
||||
foodtype = "sorbet"
|
||||
|
||||
/datum/bounty/item/botany/citrus_oranges
|
||||
name = "Oranges"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/citrus/orange)
|
||||
bonus_desc = "Do not ship lemons or limes." //I vanted orahnge!
|
||||
foodtype = "sorbet"
|
||||
|
||||
/datum/bounty/item/botany/eggplant
|
||||
name = "Eggplants"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/eggplant)
|
||||
bonus_desc = "Not to be confused with egg-plants."
|
||||
|
||||
/datum/bounty/item/botany/eggplant_eggy
|
||||
name = "Egg-plants"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/shell/eggy)
|
||||
bonus_desc = "Not to be confused with eggplants."
|
||||
multiplier = 2
|
||||
|
||||
// /datum/bounty/item/botany/kudzu
|
||||
// name = "Kudzu Pods"
|
||||
// wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/kudzupod)
|
||||
// bonus_desc = "Store in a dry, dark place."
|
||||
// multiplier = 4
|
||||
|
||||
/datum/bounty/item/botany/watermelon
|
||||
name = "Watermelons"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/watermelon)
|
||||
foodtype = "dessert"
|
||||
|
||||
/datum/bounty/item/botany/watermelon_holy
|
||||
name = "Holy Melons"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/holymelon)
|
||||
multiplier = 2
|
||||
foodtype = "dessert"
|
||||
|
||||
/datum/bounty/item/botany/glowshroom
|
||||
name = "Glowshrooms"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom)
|
||||
exclude_types = list(/obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/glowcap, /obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/shadowshroom)
|
||||
foodtype = "omelet"
|
||||
|
||||
/datum/bounty/item/botany/glowshroom_cap
|
||||
name = "Glowcaps"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/glowcap)
|
||||
multiplier = 2
|
||||
foodtype = "omelet"
|
||||
|
||||
/datum/bounty/item/botany/glowshroom_shadow
|
||||
name = "Shadowshrooms"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/shadowshroom)
|
||||
multiplier = 2
|
||||
foodtype = "omelet"
|
||||
|
||||
/datum/bounty/item/botany/nettles_death
|
||||
name = "Death Nettles"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/nettle/death)
|
||||
multiplier = 2
|
||||
bonus_desc = "Wear protection when handling them."
|
||||
foodtype = "cheese"
|
||||
|
||||
/datum/bounty/item/botany/pineapples
|
||||
name = "Pineapples"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/pineapple)
|
||||
bonus_desc = "Not for human consumption."
|
||||
foodtype = "ashtray"
|
||||
|
||||
/datum/bounty/item/botany/tomato
|
||||
name = "Tomatoes"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/tomato)
|
||||
exclude_types = list(/obj/item/reagent_containers/food/snacks/grown/tomato/blue)
|
||||
|
||||
/datum/bounty/item/botany/tomato_bluespace
|
||||
name = "Bluespace Tomatoes"
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/tomato/blue/bluespace)
|
||||
multiplier = 4
|
||||
@@ -0,0 +1,137 @@
|
||||
//Moved (most) bounties requiring botany to gardencook.dm Roundstart cook bounties go here.
|
||||
|
||||
/datum/bounty/item/chef/soup
|
||||
name = "Soup"
|
||||
description = "To quell the homeless uprising, Nanotrasen will be serving soup to all underpaid workers. Ship any type of soup."
|
||||
reward = 700
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/soup)
|
||||
|
||||
/datum/bounty/item/chef/icecreamsandwich
|
||||
name = "Ice Cream Sandwiches"
|
||||
description = "Upper management has been screaming non-stop for ice cream. Please send some."
|
||||
reward = 800
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/icecreamsandwich)
|
||||
|
||||
/datum/bounty/item/chef/bread
|
||||
name = "Bread"
|
||||
description = "Problems with central planning have led to bread prices skyrocketing. Ship some bread to ease tensions."
|
||||
reward = 1000
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/store/bread, /obj/item/reagent_containers/food/snacks/breadslice, /obj/item/reagent_containers/food/snacks/bun, /obj/item/reagent_containers/food/snacks/pizzabread, /obj/item/reagent_containers/food/snacks/rawpastrybase)
|
||||
|
||||
/datum/bounty/item/chef/pie
|
||||
name = "Pie"
|
||||
description = "3.14159? No! CentCom management wants edible pie! Ship a whole one."
|
||||
reward = 3142
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/pie)
|
||||
|
||||
/datum/bounty/item/chef/salad
|
||||
name = "Salad or Rice Bowls"
|
||||
description = "CentCom management is going on a health binge. Your order is to ship salad or rice bowls."
|
||||
reward = 1200
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/salad)
|
||||
|
||||
/datum/bounty/item/chef/superbite
|
||||
name = "Super Bite Burger"
|
||||
description = "Commander Tubbs thinks he can set a competitive eating world record. All he needs is a super bite burger shipped to him."
|
||||
reward = 1800
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/burger/superbite)
|
||||
|
||||
/datum/bounty/item/chef/poppypretzel
|
||||
name = "Poppy Pretzel"
|
||||
description = "Central Command needs a reason to fire their HR head. Send over a poppy pretzel to force a failed drug test."
|
||||
reward = 3000
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/poppypretzel)
|
||||
|
||||
// /datum/bounty/item/chef/cubancarp
|
||||
// name = "Cuban Carp"
|
||||
// description = "To celebrate the birth of Castro XXVII, ship one cuban carp to CentCom."
|
||||
// reward = 3000
|
||||
// wanted_types = list(/obj/item/reagent_containers/food/snacks/cubancarp)
|
||||
|
||||
/datum/bounty/item/chef/hotdog
|
||||
name = "Hot Dog"
|
||||
description = "Nanotrasen is conducting taste tests to determine the best hot dog recipe. Ship your station's version to participate."
|
||||
reward = 4000
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/hotdog)
|
||||
|
||||
/datum/bounty/item/chef/muffin
|
||||
name = "Muffins"
|
||||
description = "The Muffin Man is visiting CentCom, but he's forgotten his muffins! Your order is to rectify this."
|
||||
reward = 3000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/muffin)
|
||||
|
||||
/datum/bounty/item/chef/chawanmushi
|
||||
name = "Chawanmushi"
|
||||
description = "Nanotrasen wants to improve relations with its sister company, Japanotrasen. Ship Chawanmushi immediately."
|
||||
reward = 5000
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/chawanmushi)
|
||||
|
||||
/datum/bounty/item/chef/kebab
|
||||
name = "Kebabs"
|
||||
description = "Remove all kebab from station you are best food. Ship to CentCom to remove from the premises."
|
||||
reward = 1500
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/kebab)
|
||||
|
||||
/datum/bounty/item/chef/soylentgreen
|
||||
name = "Soylent Green"
|
||||
description = "CentCom has heard wonderful things about the product 'Soylent Green', and would love to try some. If you endulge them, expect a pleasant bonus."
|
||||
reward = 4000
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/soylentgreen)
|
||||
|
||||
/datum/bounty/item/chef/pancakes
|
||||
name = "Pancakes"
|
||||
description = "Here at Nanotrasen we consider employees to be family. And you know what families love? Pancakes. Ship a baker's dozen."
|
||||
reward = 4000
|
||||
required_count = 13
|
||||
wanted_types = list(/datum/crafting_recipe/food/pancakes)
|
||||
|
||||
/datum/bounty/item/chef/nuggies
|
||||
name = "Chicken Nuggets"
|
||||
description = "The vice president's son won't shut up about chicken nuggies. Would you mind shipping some?"
|
||||
reward = 2500
|
||||
required_count = 6
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/nugget)
|
||||
|
||||
/datum/bounty/item/chef/khachapuri
|
||||
name = "Khachapuri"
|
||||
description = "Bread and eggs. Bread and eggs. Bread and eggs. Also, cheese."
|
||||
reward = 2000
|
||||
required_count = 2
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/khachapuri)
|
||||
|
||||
/datum/bounty/item/chef/ratkebab
|
||||
name = "Rat Kebabs"
|
||||
description = "Centcom is requesting some -special- kebabs for it's service staff."
|
||||
reward = 1800
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/kebab/rat)
|
||||
|
||||
/datum/bounty/item/chef/benedict
|
||||
name = "Eggs Benedict"
|
||||
description = "Command requires a high-calory breakfast item. Ship it right away."
|
||||
reward = 1750
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/benedict)
|
||||
|
||||
/datum/bounty/item/chef/braincake
|
||||
name = "Brain Cake"
|
||||
description = "The science division requires a brain cake for testing purposes. Don't ask."
|
||||
reward = 1200
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/store/cake/brain)
|
||||
|
||||
/datum/bounty/item/chef/waffles
|
||||
name = "Waffles"
|
||||
description = "Security staff at Centcom are looking for a fun treat. Ship us some waffles so they can fill the cells."
|
||||
reward = 1000
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/waffles)
|
||||
|
||||
/datum/bounty/item/chef/sugarcookie
|
||||
name = "Sugar Cookies"
|
||||
description = "Everyone needs a little sugar in their life. Ship some sweets to Command so we can satiate our sweet tooth."
|
||||
reward = 1200
|
||||
required_count = 6
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/sugarcookie)
|
||||
@@ -0,0 +1,93 @@
|
||||
/datum/bounty/item/engineering/gas
|
||||
name = "Full Tank of Pluoxium"
|
||||
description = "CentCom RnD is researching extra compact internals. Ship us a tank full of Pluoxium and you'll be compensated."
|
||||
reward = 7500
|
||||
wanted_types = list(/obj/item/tank)
|
||||
var/moles_required = 20 // A full tank is 28 moles, but CentCom ignores that fact.
|
||||
var/gas_type = /datum/gas/pluoxium
|
||||
|
||||
/datum/bounty/item/engineering/gas/applies_to(obj/O)
|
||||
if(!..())
|
||||
return FALSE
|
||||
var/obj/item/tank/T = O
|
||||
if(!T.air_contents.gases[gas_type])
|
||||
return FALSE
|
||||
return T.air_contents.gases[gas_type] >= moles_required
|
||||
|
||||
//datum/bounty/item/engineering/gas/nitryl_tank
|
||||
// name = "Full Tank of Nitryl"
|
||||
// description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitryl so they can get started."
|
||||
// gas_type = /datum/gas/nitryl
|
||||
|
||||
/datum/bounty/item/engineering/gas/tritium_tank
|
||||
name = "Full Tank of Tritium"
|
||||
description = "Station 49 is looking to kickstart their research program. Ship them a tank full of Tritium."
|
||||
gas_type = /datum/gas/tritium
|
||||
|
||||
/datum/bounty/item/engineering/pacman
|
||||
name = "P.A.C.M.A.N.-type portable generator"
|
||||
description = "A neighboring station had a problem with their SMES, and now need something to power their communications console. Can you send them a P.AC.M.A.N.?"
|
||||
reward = 1500 //2500 for the cargo one
|
||||
wanted_types = list(/obj/machinery/power/port_gen/pacman)
|
||||
|
||||
/datum/bounty/item/engineering/canisters
|
||||
name = "Gas Canisters"
|
||||
description = "After a recent debacle in a nearby sector, 10 gas canisters are needed for containing an experimental aerosol before it kills all the local fauna."
|
||||
reward = 3000
|
||||
required_count = 10 //easy to make
|
||||
wanted_types = list(/obj/machinery/portable_atmospherics/canister)
|
||||
|
||||
/datum/bounty/item/engineering/microwave
|
||||
name = "Microwaves"
|
||||
description = "Due to a shortage of microwaves, our chefs are incapable of keeping up with our sheer volume of orders. We need at least three microwaves to keep up with our crew's dietary habits."
|
||||
reward = 1000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/machinery/microwave)
|
||||
|
||||
/datum/bounty/item/engineering/hydroponicstrays
|
||||
name = "Hydroponics Tray"
|
||||
description = "The garden has become a hot spot of late, they need a few more hydroponics tray to grow more flowers."
|
||||
reward = 1500
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/machinery/hydroponics)
|
||||
|
||||
/datum/bounty/item/engineering/rcd
|
||||
name = "Spare RCD"
|
||||
description = "Construction and repairs to are shuttles are going slowly. As it turns out, we're a little short on RCDs, can you send us a few?"
|
||||
reward = 1500
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/construction/rcd)
|
||||
|
||||
/datum/bounty/item/engineering/rpd
|
||||
name = "Spare RPD"
|
||||
description = "Our Atmospheric Technicians are still living in the past, relying on stationary pipe dispensers to produce the pipes necessary to accomplish their strenuous tasks. They could use an upgrade. Could you send us some Rapid Pipe Dispensers?"
|
||||
reward = 2500
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/pipe_dispenser)
|
||||
|
||||
/datum/bounty/item/engineering/heaters
|
||||
name = "Space Heaters"
|
||||
description = "The kitchen freezer was left open and now the whole place is frozen solid! We need a few space heaters to warm it back up before anyone gets hungry."
|
||||
reward = 3000
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/machinery/space_heater)
|
||||
|
||||
/datum/bounty/item/engineering/arcadetrail
|
||||
name = "Orion Trail Arcade Games"
|
||||
description = "The staff have nothing to do when off-work. Can you send us some Orion Trail games to play?"
|
||||
reward = 1500
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/machinery/computer/arcade/orion_trail)
|
||||
|
||||
/datum/bounty/item/engineering/arcadebattle
|
||||
name = "Battle Arcade Games"
|
||||
description = "The staff have nothing to do when off-work. Can you send us some Battle Arcade games to play?"
|
||||
reward = 1500
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/machinery/computer/arcade/battle)
|
||||
|
||||
/datum/bounty/item/engineering/energy_ball
|
||||
name = "Contained Tesla Ball"
|
||||
description = "Station 24 is being overrun by hordes of angry Mothpeople. They are requesting the ultimate bug zapper."
|
||||
reward = 50000 //requires 14k credits of purchases, not to mention cooperation with engineering/heads of staff to set up inside the cramped shuttle
|
||||
wanted_types = list(/obj/singularity/energy_ball)
|
||||
@@ -0,0 +1,127 @@
|
||||
/datum/bounty/item/medical/heart
|
||||
name = "Heart"
|
||||
description = "Commander Johnson is in critical condition after suffering yet another heart attack. Doctors say he needs a new heart fast. Ship one, pronto!"
|
||||
reward = 3000
|
||||
wanted_types = list(/obj/item/organ/heart)
|
||||
|
||||
/datum/bounty/item/medical/lung
|
||||
name = "Lungs"
|
||||
description = "A recent explosion at Central Command has left multiple staff with punctured lungs. Ship spare lungs to be rewarded."
|
||||
reward = 3000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/organ/lungs)
|
||||
|
||||
/datum/bounty/item/medical/appendix
|
||||
name = "Appendix"
|
||||
description = "Chef Gibb of Central Command wants to prepare a meal using a very special delicacy: an appendix. If you ship one, he'll pay."
|
||||
reward = 3500 //there are no synthetic appendixes
|
||||
wanted_types = list(/obj/item/organ/appendix)
|
||||
|
||||
/datum/bounty/item/medical/ears
|
||||
name = "Ears"
|
||||
description = "Multiple staff at Station 12 have been left deaf due to unauthorized clowning. Ship them new ears."
|
||||
reward = 5000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/organ/ears)
|
||||
|
||||
/datum/bounty/item/medical/liver
|
||||
name = "Livers"
|
||||
description = "Multiple high-ranking CentCom diplomats have been hospitalized with liver failure after a recent meeting with Third Soviet Union ambassadors. Help us out, will you?"
|
||||
reward = 5500
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/organ/liver)
|
||||
|
||||
/datum/bounty/item/medical/eye
|
||||
name = "Organic Eyes"
|
||||
description = "Station 5's Research Director Willem is requesting a few pairs of non-robotic eyes. Don't ask questions, just ship them."
|
||||
reward = 3000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/organ/eyes)
|
||||
exclude_types = list(/obj/item/organ/eyes/robotic)
|
||||
|
||||
/datum/bounty/item/medical/tongue
|
||||
name = "Tongues"
|
||||
description = "A recent attack by Mime extremists has left staff at Station 23 speechless. Ship some spare tongues."
|
||||
reward = 4500
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/organ/tongue)
|
||||
|
||||
/datum/bounty/item/medical/lizard_tail
|
||||
name = "Lizard Tail"
|
||||
description = "The Wizard Federation has made off with Nanotrasen's supply of lizard tails. While CentCom is dealing with the wizards, can the station spare a tail of their own?"
|
||||
reward = 3000
|
||||
wanted_types = list(/obj/item/organ/tail/lizard)
|
||||
|
||||
/datum/bounty/item/medical/cat_tail
|
||||
name = "Cat Tail"
|
||||
description = "Central Command has run out of heavy duty pipe cleaners. Can you ship over a cat tail to help us out?"
|
||||
reward = 3000
|
||||
wanted_types = list(/obj/item/organ/tail/cat)
|
||||
|
||||
/datum/bounty/item/medical/blood
|
||||
name = "Generic Blood"
|
||||
description = "Nanotrasen's annual blood drive is back up to full speed, following the garlic incident. Good blood in good volumes accepted for Credit returns."
|
||||
reward = 3500
|
||||
required_count = 600
|
||||
wanted_types = list(/datum/reagent/blood)
|
||||
|
||||
/* If anyone wants to try and fix/work, go for it
|
||||
/datum/bounty/item/medical/medibot // Mob so this dosn't work yet*
|
||||
name = "Medibot"
|
||||
description = "A sister station is dealing with um problem, they need a medibot to help treat their wounded..."
|
||||
reward = 3000
|
||||
wanted_types = list(/mob/living/simple_animal/bot/medbot)
|
||||
|
||||
/datum/bounty/item/medical/bloodl //Dosnt work do to how blood is yet*
|
||||
name = "L-type Blood"
|
||||
description = "After a small scuffle, a few of our lizard employees need another blood transfusion."
|
||||
reward = 4000
|
||||
required_count = 200
|
||||
wanted_types = (L,/datum/reagent/blood)
|
||||
if(istype(L,/datum/reagent/blood))
|
||||
wanted_types += L
|
||||
|
||||
/datum/bounty/item/medical/bloodu //Dosnt work do to how blood is yet*
|
||||
name = "U-Type Blood"
|
||||
description = "After dealing with a small revolt in a local penal colony, the colony's anemic CMO needs blood, urgently. With his compromised immune system, only the best blood can be used."
|
||||
reward = 5500 // Rarer blood
|
||||
required_count = 200
|
||||
wanted_types = (U,/datum/reagent/blood)
|
||||
if(istype(U,/datum/reagent/blood))
|
||||
wanted_types += U
|
||||
|
||||
*/
|
||||
|
||||
/datum/bounty/item/medical/surgery
|
||||
name = "Surgery tool implants"
|
||||
description = "Our medical interns keep dropping their Shambler's Juice while they're performing open heart surgery. One of them even had the audacity to say he only had two hands!"
|
||||
reward = 7000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/organ/cyberimp/arm/surgery)
|
||||
|
||||
/datum/bounty/item/medical/chemmaker
|
||||
name = "Portable Chem Dispenser"
|
||||
description = "After a new chemist mixed up some water and a banana, we lost our only chem dispenser. Please send us a replacement and you will be compensated."
|
||||
reward = 5000
|
||||
wanted_types = list(/obj/machinery/chem_dispenser)
|
||||
|
||||
/datum/bounty/item/medical/advhealthscaner
|
||||
name = "Advanced Health Analyzer"
|
||||
description = "A ERT Medical unit needs the new 'advanced health analyzer', for a mission at a Station 4. Can you send some?."
|
||||
reward = 3000
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/item/healthanalyzer/advanced)
|
||||
|
||||
/datum/bounty/item/medical/wallmounts
|
||||
name = "Defibrillator wall mounts"
|
||||
description = "New Space OSHA regulation state that are new cloning medical wing needs a few 'Easy to access defibrillartors'. Can you send a few before we get a lawsuit?"
|
||||
reward = 2000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/machinery/defibrillator_mount)
|
||||
|
||||
/datum/bounty/item/medical/defibrillator
|
||||
name = "New defibillators"
|
||||
description = "After years of storge are defibrillator units have become more liabilities then we want. Please send us some new ones to replace these old ones."
|
||||
reward = 2250
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/item/defibrillator)
|
||||
@@ -0,0 +1,65 @@
|
||||
/datum/bounty/item/mining/goliath_steaks
|
||||
name = "Lava-Cooked Goliath Steaks"
|
||||
description = "Admiral Pavlov has gone on hunger strike ever since the canteen started serving only monkey and monkey byproducts. She is demanding lava-cooked Goliath steaks."
|
||||
reward = 5000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/reagent_containers/food/snacks/meat/steak/goliath)
|
||||
|
||||
/datum/bounty/item/mining/goliath_boat
|
||||
name = "Goliath Hide Boat"
|
||||
description = "Commander Menkov wants to participate in the annual Lavaland Regatta. He is asking your shipwrights to build the swiftest boat known to man."
|
||||
reward = 5500
|
||||
wanted_types = list(/obj/vehicle/ridden/lavaboat)
|
||||
|
||||
/datum/bounty/item/mining/bone_oar
|
||||
name = "Bone Oars"
|
||||
description = "Commander Menkov requires oars to participate in the annual Lavaland Regatta. Ship a pair over."
|
||||
reward = 2000
|
||||
required_count = 2
|
||||
wanted_types = list(/obj/item/oar)
|
||||
|
||||
/datum/bounty/item/mining/bone_axe
|
||||
name = "Bone Axe"
|
||||
description = "Station 12 has had their fire axes stolen by marauding clowns. Ship them a bone axe as a replacement."
|
||||
reward = 3500
|
||||
wanted_types = list(/obj/item/twohanded/fireaxe/boneaxe)
|
||||
|
||||
/datum/bounty/item/mining/bone_armor
|
||||
name = "Bone Armor"
|
||||
description = "Station 14 has volunteered their lizard crew for ballistic armor testing. Ship over some bone armor."
|
||||
reward = 2000
|
||||
wanted_types = list(/obj/item/clothing/suit/armor/bone)
|
||||
|
||||
/datum/bounty/item/mining/skull_helmet
|
||||
name = "Skull Helmet"
|
||||
description = "Station 42's Head of Security has her birthday tomorrow! We want to suprise her with a fashionable skull helmet."
|
||||
reward = 2000
|
||||
wanted_types = list(/obj/item/clothing/head/helmet/skull)
|
||||
|
||||
/datum/bounty/item/mining/bone_talisman
|
||||
name = "Bone Talismans"
|
||||
description = "Station 14's Research Director claims that pagan bone talismans protect their wearer. Ship them a few so they can start testing."
|
||||
reward = 3500
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/clothing/accessory/talisman)
|
||||
|
||||
/datum/bounty/item/mining/bone_dagger
|
||||
name = "Bone Daggers"
|
||||
description = "Central Command's canteen is undergoing budget cuts. Ship over some bone daggers so our Chef can keep working."
|
||||
reward = 1000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/kitchen/knife/combat/bone)
|
||||
|
||||
/datum/bounty/item/mining/basalt
|
||||
name = "Artificial Basalt Tiles"
|
||||
description = "Central Command's Ash Walker exhibit needs to be expanded again, we just need some more basalt flooring."
|
||||
reward = 2200
|
||||
required_count = 60
|
||||
wanted_types = list(/obj/item/stack/tile/basalt)
|
||||
|
||||
/datum/bounty/item/mining/fruit
|
||||
name = "Cactus Fruit"
|
||||
description = "Central Command's Ash Walker habitat needs more fauna, send us some local fruit seeds!"
|
||||
reward = 1000
|
||||
required_count = 1
|
||||
wanted_types = list(/obj/item/seeds/lavaland/cactus)
|
||||
@@ -0,0 +1,171 @@
|
||||
/datum/bounty/reagent
|
||||
var/required_volume = 10
|
||||
var/shipped_volume = 0
|
||||
var/datum/reagent/wanted_reagent
|
||||
|
||||
/datum/bounty/reagent/completion_string()
|
||||
return {"[round(shipped_volume)]/[required_volume] Units"}
|
||||
|
||||
/datum/bounty/reagent/can_claim()
|
||||
return ..() && shipped_volume >= required_volume
|
||||
|
||||
/datum/bounty/reagent/applies_to(obj/O)
|
||||
if(!istype(O, /obj/item/reagent_containers))
|
||||
return FALSE
|
||||
if(!O.reagents || !O.reagents.has_reagent(wanted_reagent.id))
|
||||
return FALSE
|
||||
if(O.flags_1 & HOLOGRAM_1)
|
||||
return FALSE
|
||||
return shipped_volume < required_volume
|
||||
|
||||
/datum/bounty/reagent/ship(obj/O)
|
||||
if(!applies_to(O))
|
||||
return
|
||||
shipped_volume += O.reagents.get_reagent_amount(wanted_reagent.id)
|
||||
if(shipped_volume > required_volume)
|
||||
shipped_volume = required_volume
|
||||
|
||||
/datum/bounty/reagent/compatible_with(other_bounty)
|
||||
if(!istype(other_bounty, /datum/bounty/reagent))
|
||||
return TRUE
|
||||
var/datum/bounty/reagent/R = other_bounty
|
||||
return wanted_reagent.id != R.wanted_reagent.id
|
||||
|
||||
/datum/bounty/reagent/simple_drink
|
||||
name = "Simple Drink"
|
||||
reward = 1500
|
||||
|
||||
datum/bounty/reagent/simple_drink/New()
|
||||
// Don't worry about making this comprehensive. It doesn't matter if some drinks are skipped.
|
||||
var/static/list/possible_reagents = list(\
|
||||
/datum/reagent/consumable/ethanol/antifreeze,\
|
||||
/datum/reagent/consumable/ethanol/andalusia,\
|
||||
/datum/reagent/consumable/tea/arnold_palmer,\
|
||||
/datum/reagent/consumable/ethanol/b52,\
|
||||
/datum/reagent/consumable/ethanol/bananahonk,\
|
||||
/datum/reagent/consumable/ethanol/beepsky_smash,\
|
||||
/datum/reagent/consumable/ethanol/between_the_sheets,\
|
||||
/datum/reagent/consumable/ethanol/bilk,\
|
||||
/datum/reagent/consumable/ethanol/black_russian,\
|
||||
/datum/reagent/consumable/ethanol/bloody_mary,\
|
||||
/datum/reagent/consumable/ethanol/brave_bull,\
|
||||
/datum/reagent/consumable/ethanol/martini,\
|
||||
/datum/reagent/consumable/ethanol/cuba_libre,\
|
||||
/datum/reagent/consumable/ethanol/eggnog,\
|
||||
/datum/reagent/consumable/ethanol/erikasurprise,\
|
||||
/datum/reagent/consumable/ethanol/ginfizz,\
|
||||
/datum/reagent/consumable/ethanol/gintonic,\
|
||||
/datum/reagent/consumable/ethanol/grappa,\
|
||||
/datum/reagent/consumable/ethanol/grog,\
|
||||
/datum/reagent/consumable/ethanol/hooch,\
|
||||
/datum/reagent/consumable/ethanol/iced_beer,\
|
||||
/datum/reagent/consumable/ethanol/irishcarbomb,\
|
||||
/datum/reagent/consumable/ethanol/manhattan,\
|
||||
/datum/reagent/consumable/ethanol/margarita,\
|
||||
/datum/reagent/consumable/ethanol/gargle_blaster,\
|
||||
/datum/reagent/consumable/ethanol/rum_coke,\
|
||||
/datum/reagent/consumable/ethanol/screwdrivercocktail,\
|
||||
/datum/reagent/consumable/ethanol/snowwhite,\
|
||||
/datum/reagent/consumable/soy_latte,\
|
||||
/datum/reagent/consumable/cafe_latte,\
|
||||
/datum/reagent/consumable/ethanol/syndicatebomb,\
|
||||
/datum/reagent/consumable/ethanol/tequila_sunrise,\
|
||||
/datum/reagent/consumable/ethanol/manly_dorf,\
|
||||
/datum/reagent/consumable/ethanol/thirteenloko,\
|
||||
/datum/reagent/consumable/triple_citrus,\
|
||||
/datum/reagent/consumable/ethanol/vodkamartini,\
|
||||
/datum/reagent/consumable/ethanol/whiskeysoda,\
|
||||
/datum/reagent/consumable/ethanol/beer/green,\
|
||||
/datum/reagent/consumable/ethanol/demonsblood,\
|
||||
/datum/reagent/consumable/ethanol/crevice_spike,\
|
||||
/datum/reagent/consumable/ethanol/singulo,\
|
||||
/datum/reagent/consumable/ethanol/whiskey_sour)
|
||||
|
||||
var/reagent_type = pick(possible_reagents)
|
||||
wanted_reagent = new reagent_type
|
||||
name = wanted_reagent.name
|
||||
description = "CentCom is thirsty! Send a shipment of [name] to CentCom to quench the company's thirst."
|
||||
reward += rand(0, 2) * 500
|
||||
|
||||
/datum/bounty/reagent/complex_drink
|
||||
name = "Complex Drink"
|
||||
reward = 4000
|
||||
|
||||
datum/bounty/reagent/complex_drink/New()
|
||||
// Don't worry about making this comprehensive. It doesn't matter if some drinks are skipped.
|
||||
var/static/list/possible_reagents = list(\
|
||||
/datum/reagent/consumable/ethanol/atomicbomb,\
|
||||
/datum/reagent/consumable/ethanol/bacchus_blessing,\
|
||||
/datum/reagent/consumable/ethanol/bastion_bourbon,\
|
||||
/datum/reagent/consumable/ethanol/booger,\
|
||||
/datum/reagent/consumable/ethanol/hippies_delight,\
|
||||
/datum/reagent/consumable/ethanol/drunkenblumpkin,\
|
||||
/datum/reagent/consumable/ethanol/fetching_fizz,\
|
||||
/datum/reagent/consumable/ethanol/goldschlager,\
|
||||
/datum/reagent/consumable/ethanol/hearty_punch,\
|
||||
/datum/reagent/consumable/ethanol/manhattan_proj,\
|
||||
/datum/reagent/consumable/ethanol/narsour,\
|
||||
/datum/reagent/consumable/ethanol/neurotoxin,\
|
||||
/datum/reagent/consumable/ethanol/patron,\
|
||||
/datum/reagent/consumable/ethanol/quadruple_sec,\
|
||||
/datum/reagent/consumable/ethanol/quintuple_sec,\
|
||||
/datum/reagent/consumable/doctor_delight,\
|
||||
/datum/reagent/consumable/ethanol/silencer)
|
||||
|
||||
var/reagent_type = pick(possible_reagents)
|
||||
wanted_reagent = new reagent_type
|
||||
name = wanted_reagent.name
|
||||
description = "CentCom is offering a reward for talented mixologists. Ship a container of [name] to claim the prize."
|
||||
reward += rand(0, 4) * 300
|
||||
|
||||
/datum/bounty/reagent/chemical
|
||||
name = "Chemical"
|
||||
reward = 2750
|
||||
required_volume = 30
|
||||
|
||||
datum/bounty/reagent/chemical/New()
|
||||
// Don't worry about making this comprehensive. It doesn't matter if some chems are skipped.
|
||||
var/static/list/possible_reagents = list(\
|
||||
/datum/reagent/medicine/leporazine,\
|
||||
/datum/reagent/medicine/clonexadone,\
|
||||
/datum/reagent/medicine/pyroxadone,\
|
||||
/datum/reagent/medicine/rezadone,\
|
||||
/datum/reagent/medicine/mine_salve,\
|
||||
/datum/reagent/medicine/pen_acid,\
|
||||
/datum/reagent/medicine/perfluorodecalin,\
|
||||
/datum/reagent/medicine/ephedrine,\
|
||||
/datum/reagent/medicine/diphenhydramine,\
|
||||
/datum/reagent/medicine/atropine,\
|
||||
/datum/reagent/medicine/strange_reagent,\
|
||||
/datum/reagent/medicine/regen_jelly,\
|
||||
/datum/reagent/drug/space_drugs,\
|
||||
/datum/reagent/drug/crank,\
|
||||
/datum/reagent/drug/krokodil,\
|
||||
/datum/reagent/drug/methamphetamine,\
|
||||
/datum/reagent/drug/bath_salts,\
|
||||
/datum/reagent/drug/aranesp,\
|
||||
/datum/reagent/nitroglycerin,\
|
||||
/datum/reagent/blackpowder,\
|
||||
/datum/reagent/napalm,\
|
||||
/datum/reagent/teslium,\
|
||||
/datum/reagent/firefighting_foam,\
|
||||
/datum/reagent/consumable/honey,\
|
||||
/datum/reagent/consumable/mayonnaise,\
|
||||
/datum/reagent/consumable/frostoil,\
|
||||
/datum/reagent/toxin/slimejelly,\
|
||||
/datum/reagent/toxin/itching_powder,\
|
||||
/datum/reagent/toxin/amanitin,\
|
||||
/datum/reagent/toxin/coniine,\
|
||||
/datum/reagent/toxin/cyanide,\
|
||||
/datum/reagent/toxin/heparin,\
|
||||
/datum/reagent/toxin/skewium,\
|
||||
/datum/reagent/toxin/anacea,\
|
||||
/datum/reagent/toxin/mimesbane,\
|
||||
/datum/reagent/pax)
|
||||
|
||||
var/reagent_type = pick(possible_reagents)
|
||||
wanted_reagent = new reagent_type
|
||||
name = wanted_reagent.name
|
||||
description = "CentCom is in desperate need of the chemical [name]. Ship a container of it to be rewarded."
|
||||
reward += rand(0, 4) * 500
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
/datum/bounty/item/science/boh
|
||||
name = "Bag of Holding"
|
||||
description = "Nanotrasen would make good use of high-capacity backpacks. If you have any, please ship them."
|
||||
reward = 5000
|
||||
wanted_types = list(/obj/item/storage/backpack/holding)
|
||||
|
||||
/datum/bounty/item/science/tboh
|
||||
name = "Trash Bag of Holding"
|
||||
description = "Nanotrasen would make good use of high-capacity trash bags. If you have any, please ship them."
|
||||
reward = 3000
|
||||
wanted_types = list(/obj/item/storage/backpack/holding)
|
||||
|
||||
/datum/bounty/item/science/bluespace_syringe
|
||||
name = "Bluespace Syringe"
|
||||
description = "Nanotrasen would make good use of high-capacity syringes. If you have any, please ship them."
|
||||
reward = 1500
|
||||
wanted_types = list(/obj/item/reagent_containers/syringe/bluespace)
|
||||
|
||||
/datum/bounty/item/science/bluespace_body_bag
|
||||
name = "Bluespace Body Bag"
|
||||
description = "Nanotrasen would make good use of high-capacity body bags. If you have any, please ship them."
|
||||
reward = 5000
|
||||
wanted_types = list(/obj/item/bodybag/bluespace)
|
||||
|
||||
/datum/bounty/item/science/nightvision_goggles
|
||||
name = "Night Vision Goggles"
|
||||
description = "An electrical storm has busted all the lights at CentCom. While management is waiting for replacements, perhaps some night vision goggles can be shipped?"
|
||||
reward = 1000
|
||||
wanted_types = list(/obj/item/clothing/glasses/night, /obj/item/clothing/glasses/meson/night, /obj/item/clothing/glasses/hud/health/night, /obj/item/clothing/glasses/hud/security/night, /obj/item/clothing/glasses/hud/diagnostic/night)
|
||||
|
||||
/datum/bounty/item/science/experimental_welding_tool
|
||||
name = "Experimental Welding Tool"
|
||||
description = "A recent accident has left most of CentCom's welding tools exploded. Ship replacements to be rewarded."
|
||||
reward = 5000
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/weldingtool/experimental)
|
||||
|
||||
/datum/bounty/item/science/cryostasis_beaker
|
||||
name = "Cryostasis Beaker"
|
||||
description = "Chemists at Central Command have discovered a new chemical that can only be held in cryostasis beakers. The only problem is they don't have any! Rectify this to receive payment."
|
||||
reward = 2000
|
||||
wanted_types = list(/obj/item/reagent_containers/glass/beaker/noreact)
|
||||
|
||||
/datum/bounty/item/science/diamond_drill
|
||||
name = "Diamond Mining Drill"
|
||||
description = "Central Command is willing to pay three months salary in exchange for one diamond mining drill."
|
||||
reward = 5500
|
||||
wanted_types = list(/obj/item/pickaxe/drill/diamonddrill, /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill)
|
||||
|
||||
/datum/bounty/item/science/floor_buffer
|
||||
name = "Floor Buffer Upgrade"
|
||||
description = "One of CentCom's janitors made a small fortune betting on carp races. Now they'd like to commission an upgrade to their floor buffer."
|
||||
reward = 3000
|
||||
wanted_types = list(/obj/item/janiupgrade)
|
||||
|
||||
/datum/bounty/item/science/advanced_mop
|
||||
name = "Advanced Mop"
|
||||
description = "Excuse me. I'd like to request $17 for a push broom rebristling. Either that, or an advanced mop."
|
||||
reward = 3000
|
||||
wanted_types = list(/obj/item/mop/advanced)
|
||||
|
||||
/datum/bounty/item/science/advanced_egun
|
||||
name = "Advanced Energy Gun"
|
||||
description = "With the price of rechargers on the rise, upper management is interested in purchasing guns that are self-powered. If you ship one, they'll pay."
|
||||
reward = 1800
|
||||
wanted_types = list(/obj/item/gun/energy/e_gun/nuclear)
|
||||
|
||||
/datum/bounty/item/science/bscells
|
||||
name = "Bluespace Power Cells"
|
||||
description = "Someone in upper management keeps using the excuse that his tablet battery dies when he's in the middle of work. This will be the last time he doesn't have his presentation, I swear to -"
|
||||
reward = 3000
|
||||
required_count = 10 //Easy to make
|
||||
wanted_types = list(/obj/item/stock_parts/cell/bluespace)
|
||||
|
||||
/datum/bounty/item/science/t4manip
|
||||
name = "Femto-Manipulators"
|
||||
description = "One of our Chief Engineers has OCD. Can you send us some femto-manipulators so he stops complaining that his ID doesn't fit perfectly in the PDA slot?"
|
||||
reward = 2000
|
||||
required_count = 20 //Easy to make
|
||||
wanted_types = list(/obj/item/stock_parts/manipulator/femto)
|
||||
|
||||
/datum/bounty/item/science/t4bins
|
||||
name = "Bluespace Matter Bins"
|
||||
description = "The local Janitorial union has gone on strike. Can you send us some bluespace bins so we don't have to take out our own trash?"
|
||||
reward = 2000
|
||||
required_count = 20 //Easy to make
|
||||
wanted_types = list(/obj/item/stock_parts/matter_bin/bluespace)
|
||||
|
||||
/datum/bounty/item/science/t4capacitor
|
||||
name = "Quadratic Capacitor"
|
||||
description = "One of our linguists doesn't understand why they're called Quadratic capacitors. Can you give him a few so he leaves us alone about it?"
|
||||
reward = 2000
|
||||
required_count = 20 //Easy to make
|
||||
wanted_types = list(/obj/item/stock_parts/capacitor/quadratic)
|
||||
|
||||
/datum/bounty/item/science/t4triphasic
|
||||
name = "Triphasic Scanning Module"
|
||||
description = "One of our scientists got into the liberty caps and is demanding new scanning modules so he can talk to ghosts. At this point we just want him out of our office."
|
||||
reward = 2000
|
||||
required_count = 20 //Easy to make
|
||||
wanted_types = list(/obj/item/stock_parts/scanning_module/triphasic)
|
||||
|
||||
/datum/bounty/item/science/t4microlaser
|
||||
name = "Quad-Ultra Micro-Laser"
|
||||
description = "The cats on Vega 9 are breeding out of control. We need something to corral them into one area so we can saturation bomb it."
|
||||
reward = 2000
|
||||
required_count = 20 //Easy to make
|
||||
wanted_types = list(/obj/item/stock_parts/micro_laser/quadultra)
|
||||
|
||||
/datum/bounty/item/science/fakecrystals
|
||||
name = "synthetic bluespace crystals"
|
||||
description = "Don't, uh, tell anyone, but one of our BSA arrays might have had a little... accident. Send us some bluespace crystals so we can recalibrate it before anyone realizes. The whole set uses artificial bluespace crystals, so we need and not any other type of bluespace crystals..."
|
||||
reward = 8000
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/item/stack/ore/bluespace_crystal/artificial)
|
||||
exclude_types = list(/obj/item/stack/ore/bluespace_crystal,
|
||||
/obj/item/stack/sheet/bluespace_crystal,
|
||||
/obj/item/stack/ore/bluespace_crystal/refined)
|
||||
@@ -0,0 +1,54 @@
|
||||
/datum/bounty/item/security/riotshotgun
|
||||
name = "Riot Shotguns"
|
||||
description = "Hooligans have boarded CentCom! Ship riot shotguns quick, or things are going to get dirty."
|
||||
reward = 2500
|
||||
required_count = 2
|
||||
wanted_types = list(/obj/item/gun/ballistic/shotgun/riot)
|
||||
|
||||
/datum/bounty/item/security/recharger
|
||||
name = "Rechargers"
|
||||
description = "Nanotrasen military academy is conducting marksmanship exercises. They request that rechargers be shipped."
|
||||
reward = 1700
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/machinery/recharger)
|
||||
|
||||
/datum/bounty/item/security/practice
|
||||
name = "Practice Laser Gun"
|
||||
description = "Nanotrasen Military Academy is conducting routine marksmanship exercises. The clown hid all the practice lasers, and we're not using live weapons after last time."
|
||||
reward = 1500
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/gun/energy/laser/practice)
|
||||
|
||||
/datum/bounty/item/security/flashshield
|
||||
name = "Strobe Shield"
|
||||
description = "One of our Emergency Response Agents thinks there's vampires in a local station. Send him something to help with his fear of the dark and protect him, too."
|
||||
reward = 3000
|
||||
wanted_types = list(/obj/item/assembly/flash/shield)
|
||||
|
||||
/datum/bounty/item/security/sechuds
|
||||
name = "Sec HUDs"
|
||||
description = "Nanotrasen military academy has started to train officers how to use Sec HUDs to the fullest affect. Please send spare Sec HUDs so we can teach the men."
|
||||
reward = 1250
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/item/clothing/glasses/hud/security)
|
||||
|
||||
/datum/bounty/item/security/techslugs
|
||||
name = "Tech Slugs"
|
||||
description = "Nanotrasen Military Academy is conducting an ammo loading and use lessons, on the new 'Tech Slugs'. Problem is we don't have any, please fix this..."
|
||||
reward = 3500
|
||||
required_count = 15
|
||||
wanted_types = list(/obj/item/ammo_casing/shotgun/techshell)
|
||||
|
||||
/datum/bounty/item/security/wt550
|
||||
name = "Spare WT-550 clips"
|
||||
description = "Nanotrasen Military Academy's ammunition is running low, please send in spare ammo for practice."
|
||||
reward = 1500
|
||||
required_count = 5
|
||||
wanted_types = list(/obj/item/ammo_box/magazine/wt550m9)
|
||||
|
||||
/datum/bounty/item/security/pins
|
||||
name = "Test range firing pins"
|
||||
description = "Nanotrasen Military Academy just got a new set of guns, sadly they didn't come with any pins. Can you send us some Test range locked firing pins?"
|
||||
reward = 2750
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/firing_pin/test_range)
|
||||
@@ -0,0 +1,39 @@
|
||||
/datum/bounty/item/slime
|
||||
reward = 1950
|
||||
|
||||
/datum/bounty/item/slime/New()
|
||||
..()
|
||||
description = "Nanotrasen's science lead is hunting for the rare and exotic [name]. A bounty has been offered for finding it."
|
||||
reward += rand(0, 4) * 250
|
||||
|
||||
/datum/bounty/item/slime/green
|
||||
name = "Green Slime Extract"
|
||||
wanted_types = list(/obj/item/slime_extract/green)
|
||||
|
||||
/datum/bounty/item/slime/pink
|
||||
name = "Pink Slime Extract"
|
||||
wanted_types = list(/obj/item/slime_extract/pink)
|
||||
|
||||
/datum/bounty/item/slime/gold
|
||||
name = "Gold Slime Extract"
|
||||
wanted_types = list(/obj/item/slime_extract/gold)
|
||||
|
||||
/datum/bounty/item/slime/oil
|
||||
name = "Oil Slime Extract"
|
||||
wanted_types = list(/obj/item/slime_extract/oil)
|
||||
|
||||
/datum/bounty/item/slime/black
|
||||
name = "Black Slime Extract"
|
||||
wanted_types = list(/obj/item/slime_extract/black)
|
||||
|
||||
/datum/bounty/item/slime/lightpink
|
||||
name = "Light Pink Slime Extract"
|
||||
wanted_types = list(/obj/item/slime_extract/lightpink)
|
||||
|
||||
/datum/bounty/item/slime/adamantine
|
||||
name = "Adamantine Slime Extract"
|
||||
wanted_types = list(/obj/item/slime_extract/adamantine)
|
||||
|
||||
/datum/bounty/item/slime/rainbow
|
||||
name = "Rainbow Slime Extract"
|
||||
wanted_types = list(/obj/item/slime_extract/rainbow)
|
||||
@@ -0,0 +1,48 @@
|
||||
/datum/bounty/item/alien_organs
|
||||
name = "Alien Organs"
|
||||
description = "Nanotrasen is interested in studying Xenomorph biology. Ship a set of organs to be thoroughly compensated."
|
||||
reward = 13500
|
||||
required_count = 3
|
||||
wanted_types = list(/obj/item/organ/brain/alien, /obj/item/organ/alien, /obj/item/organ/body_egg/alien_embryo)
|
||||
|
||||
/datum/bounty/item/syndicate_documents
|
||||
name = "Syndicate Documents"
|
||||
description = "Intel regarding the syndicate is highly prized at CentCom. If you find syndicate documents, ship them. You could save lives."
|
||||
reward = 10000
|
||||
wanted_types = list(/obj/item/documents/syndicate, /obj/item/documents/photocopy)
|
||||
|
||||
/datum/bounty/item/syndicate_documents/applies_to(obj/O)
|
||||
if(!..())
|
||||
return FALSE
|
||||
if(istype(O, /obj/item/documents/photocopy))
|
||||
var/obj/item/documents/photocopy/Copy = O
|
||||
return (Copy.copy_type && ispath(Copy.copy_type, /obj/item/documents/syndicate))
|
||||
return TRUE
|
||||
|
||||
/datum/bounty/item/adamantine
|
||||
name = "Adamantine"
|
||||
description = "Nanotrasen's anomalous materials division is in desparate need for Adamantine. Send them a large shipment and we'll make it worth your while."
|
||||
reward = 15000
|
||||
required_count = 10
|
||||
wanted_types = list(/obj/item/stack/sheet/mineral/adamantine)
|
||||
|
||||
/datum/bounty/more_bounties
|
||||
name = "More Bounties"
|
||||
description = "Complete enough bounties and CentCom will issue new ones!"
|
||||
reward = 8 // number of bounties
|
||||
var/required_bounties = 3
|
||||
|
||||
/datum/bounty/more_bounties/can_claim()
|
||||
return ..() && completed_bounty_count() >= required_bounties
|
||||
|
||||
/datum/bounty/more_bounties/completion_string()
|
||||
return "[min(required_bounties, completed_bounty_count())]/[required_bounties] Bounties"
|
||||
|
||||
/datum/bounty/more_bounties/reward_string()
|
||||
return "Up to [reward] new bounties"
|
||||
|
||||
/datum/bounty/more_bounties/claim()
|
||||
if(can_claim())
|
||||
claimed = TRUE
|
||||
for(var/i = 0; i < reward; ++i)
|
||||
try_add_bounty(random_bounty())
|
||||
@@ -0,0 +1,81 @@
|
||||
/datum/bounty/virus
|
||||
reward = 3000
|
||||
var/shipped = FALSE
|
||||
var/stat_value = 0
|
||||
var/stat_name = ""
|
||||
|
||||
/datum/bounty/virus/New()
|
||||
..()
|
||||
stat_value = rand(4, 11)
|
||||
if(rand(3) == 1)
|
||||
stat_value *= -1
|
||||
name = "Virus ([stat_name] of [stat_value])"
|
||||
description = "Nanotrasen is interested in a virus with a [stat_name] stat of exactly [stat_value]. Central Command will pay handsomely for such a virus."
|
||||
reward += rand(0, 4) * 400
|
||||
|
||||
/datum/bounty/virus/completion_string()
|
||||
return shipped ? "Shipped" : "Not Shipped"
|
||||
|
||||
/datum/bounty/virus/can_claim()
|
||||
return ..() && shipped
|
||||
|
||||
/datum/bounty/virus/applies_to(obj/O)
|
||||
if(shipped)
|
||||
return FALSE
|
||||
if(O.flags_1 & HOLOGRAM_1)
|
||||
return FALSE
|
||||
if(!istype(O, /obj/item/reagent_containers || !O.reagents || !O.reagents.reagent_list))
|
||||
return FALSE
|
||||
var/datum/reagent/blood/B = locate() in O.reagents.reagent_list
|
||||
if(!B)
|
||||
return FALSE
|
||||
for(var/V in B.get_diseases())
|
||||
if(!istype(V, /datum/disease/advance))
|
||||
continue
|
||||
if(accepts_virus(V))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/bounty/virus/ship(obj/O)
|
||||
if(!applies_to(O))
|
||||
return
|
||||
shipped = TRUE
|
||||
|
||||
/datum/bounty/virus/compatible_with(datum/other_bounty)
|
||||
if(!istype(other_bounty, /datum/bounty/virus))
|
||||
return TRUE
|
||||
var/datum/bounty/virus/V = other_bounty
|
||||
return type != V.type || stat_value != V.stat_value
|
||||
|
||||
|
||||
/datum/bounty/virus/proc/accepts_virus(V)
|
||||
return TRUE
|
||||
|
||||
/datum/bounty/virus/resistance
|
||||
stat_name = "resistance"
|
||||
|
||||
/datum/bounty/virus/resistance/accepts_virus(V)
|
||||
var/datum/disease/advance/A = V
|
||||
return A.totalResistance() == stat_value
|
||||
|
||||
/datum/bounty/virus/stage_speed
|
||||
stat_name = "stage speed"
|
||||
|
||||
/datum/bounty/virus/stage_speed/accepts_virus(V)
|
||||
var/datum/disease/advance/A = V
|
||||
return A.totalStageSpeed() == stat_value
|
||||
|
||||
/datum/bounty/virus/stealth
|
||||
stat_name = "stealth"
|
||||
|
||||
/datum/bounty/virus/stealth/accepts_virus(V)
|
||||
var/datum/disease/advance/A = V
|
||||
return A.totalStealth() == stat_value
|
||||
|
||||
/datum/bounty/virus/transmit
|
||||
stat_name = "transmissible"
|
||||
|
||||
/datum/bounty/virus/transmit/accepts_virus(V)
|
||||
var/datum/disease/advance/A = V
|
||||
return A.totalTransmittable() == stat_value
|
||||
|
||||
@@ -0,0 +1,186 @@
|
||||
GLOBAL_LIST_EMPTY(bounties_list)
|
||||
|
||||
/datum/bounty
|
||||
var/name
|
||||
var/description
|
||||
var/reward = 1000 // In credits.
|
||||
var/claimed = FALSE
|
||||
var/high_priority = FALSE
|
||||
|
||||
// Displayed on bounty UI screen.
|
||||
/datum/bounty/proc/completion_string()
|
||||
return ""
|
||||
|
||||
// Displayed on bounty UI screen.
|
||||
/datum/bounty/proc/reward_string()
|
||||
return "[reward] Credits"
|
||||
|
||||
/datum/bounty/proc/can_claim()
|
||||
return !claimed
|
||||
|
||||
// Called when the claim button is clicked. Override to provide fancy rewards.
|
||||
/datum/bounty/proc/claim()
|
||||
if(can_claim())
|
||||
SSshuttle.points += reward
|
||||
claimed = TRUE
|
||||
|
||||
// If an item sent in the cargo shuttle can satisfy the bounty.
|
||||
/datum/bounty/proc/applies_to(obj/O)
|
||||
return FALSE
|
||||
|
||||
// Called when an object is shipped on the cargo shuttle.
|
||||
/datum/bounty/proc/ship(obj/O)
|
||||
return
|
||||
|
||||
// When randomly generating the bounty list, duplicate bounties must be avoided.
|
||||
// This proc is used to determine if two bounties are duplicates, or incompatible in general.
|
||||
/datum/bounty/proc/compatible_with(other_bounty)
|
||||
return TRUE
|
||||
|
||||
/datum/bounty/proc/mark_high_priority(scale_reward = 2)
|
||||
if(high_priority)
|
||||
return
|
||||
high_priority = TRUE
|
||||
reward = round(reward * scale_reward)
|
||||
|
||||
// This proc is called when the shuttle docks at CentCom.
|
||||
// It handles items shipped for bounties.
|
||||
/proc/bounty_ship_item_and_contents(atom/movable/AM, dry_run=FALSE)
|
||||
if(!GLOB.bounties_list.len)
|
||||
setup_bounties()
|
||||
|
||||
var/list/matched_one = FALSE
|
||||
for(var/thing in reverseRange(AM.GetAllContents()))
|
||||
var/matched_this = FALSE
|
||||
for(var/datum/bounty/B in GLOB.bounties_list)
|
||||
if(B.applies_to(thing))
|
||||
matched_one = TRUE
|
||||
matched_this = TRUE
|
||||
if(!dry_run)
|
||||
B.ship(thing)
|
||||
if(!dry_run && matched_this)
|
||||
qdel(thing)
|
||||
return matched_one
|
||||
|
||||
// Returns FALSE if the bounty is incompatible with the current bounties.
|
||||
/proc/try_add_bounty(datum/bounty/new_bounty)
|
||||
if(!new_bounty || !new_bounty.name || !new_bounty.description)
|
||||
return FALSE
|
||||
for(var/i in GLOB.bounties_list)
|
||||
var/datum/bounty/B = i
|
||||
if(!B.compatible_with(new_bounty) || !new_bounty.compatible_with(B))
|
||||
return FALSE
|
||||
GLOB.bounties_list += new_bounty
|
||||
return TRUE
|
||||
|
||||
// Returns a new bounty of random type, but does not add it to GLOB.bounties_list.
|
||||
/proc/random_bounty()
|
||||
switch(rand(1, 15))
|
||||
if(1)
|
||||
var/subtype = pick(subtypesof(/datum/bounty/item/assistant))
|
||||
return new subtype
|
||||
if(2)
|
||||
var/subtype = pick(subtypesof(/datum/bounty/item/mech))
|
||||
return new subtype
|
||||
if(3)
|
||||
var/subtype = pick(subtypesof(/datum/bounty/item/chef))
|
||||
return new subtype
|
||||
if(4)
|
||||
var/subtype = pick(subtypesof(/datum/bounty/item/security))
|
||||
return new subtype
|
||||
if(5)
|
||||
if(rand(2) == 1)
|
||||
return new /datum/bounty/reagent/simple_drink
|
||||
return new /datum/bounty/reagent/complex_drink
|
||||
if(6)
|
||||
return new /datum/bounty/reagent/chemical
|
||||
if(7)
|
||||
var/subtype = pick(subtypesof(/datum/bounty/virus))
|
||||
return new subtype
|
||||
if(8)
|
||||
var/subtype = pick(subtypesof(/datum/bounty/item/science))
|
||||
return new subtype
|
||||
if(9)
|
||||
var/subtype = pick(subtypesof(/datum/bounty/item/slime))
|
||||
return new subtype
|
||||
if(10)
|
||||
var/subtype = pick(subtypesof(/datum/bounty/item/engineering))
|
||||
return new subtype
|
||||
if(11)
|
||||
var/subtype = pick(subtypesof(/datum/bounty/item/mining))
|
||||
return new subtype
|
||||
if(12)
|
||||
var/subtype = pick(subtypesof(/datum/bounty/item/medical))
|
||||
return new subtype
|
||||
if(13)
|
||||
var/subtype = pick(subtypesof(/datum/bounty/item/botany))
|
||||
return new subtype
|
||||
if(14)
|
||||
var/subtype = pick(subtypesof(/datum/bounty/item/silly))
|
||||
return new subtype
|
||||
if(15)
|
||||
var/subtype = pick(subtypesof(/datum/bounty/item/gardencook))
|
||||
return new subtype
|
||||
|
||||
// Called lazily at startup to populate GLOB.bounties_list with random bounties.
|
||||
/proc/setup_bounties()
|
||||
|
||||
var/pick // instead of creating it a bunch let's go ahead and toss it here, we know we're going to use it for dynamics and subtypes!
|
||||
|
||||
/********************************Subtype Gens********************************/
|
||||
var/list/easy_add_list_subtypes = list(/datum/bounty/item/assistant = 2,
|
||||
/datum/bounty/item/mech = 1,
|
||||
/datum/bounty/item/chef = 2,
|
||||
/datum/bounty/item/security = 1,
|
||||
/datum/bounty/virus = 1,
|
||||
/datum/bounty/item/engineering = 1,
|
||||
/datum/bounty/item/mining = 2,
|
||||
/datum/bounty/item/medical = 2,
|
||||
/datum/bounty/item/botany = 2,
|
||||
/datum/bounty/item/silly = 1,
|
||||
/datum/bounty/item/gardencook = 1)
|
||||
|
||||
for(var/the_type in easy_add_list_subtypes)
|
||||
for(var/i in 1 to easy_add_list_subtypes[the_type])
|
||||
pick = pick(subtypesof(the_type))
|
||||
try_add_bounty(new pick)
|
||||
|
||||
/********************************Strict Type Gens********************************/
|
||||
var/list/easy_add_list_strict_types = list(/datum/bounty/reagent/simple_drink = 1,
|
||||
/datum/bounty/reagent/complex_drink = 1,
|
||||
/datum/bounty/reagent/chemical = 1)
|
||||
|
||||
for(var/the_strict_type in easy_add_list_strict_types)
|
||||
for(var/i in 1 to easy_add_list_strict_types[the_strict_type])
|
||||
try_add_bounty(new the_strict_type)
|
||||
|
||||
/********************************Dynamic Gens********************************/
|
||||
|
||||
for(var/i in 0 to 1)
|
||||
if(prob(50))
|
||||
pick = pick(subtypesof(/datum/bounty/item/slime))
|
||||
else
|
||||
pick = pick(subtypesof(/datum/bounty/item/science))
|
||||
try_add_bounty(new pick)
|
||||
|
||||
/********************************Cutoff for Non-Low Priority Bounties********************************/
|
||||
var/datum/bounty/B = pick(GLOB.bounties_list)
|
||||
B.mark_high_priority()
|
||||
|
||||
/********************************Low Priority Gens********************************/
|
||||
var/list/low_priority_strict_type_list = list( /datum/bounty/item/alien_organs,
|
||||
/datum/bounty/item/syndicate_documents,
|
||||
/datum/bounty/item/adamantine,
|
||||
/datum/bounty/more_bounties)
|
||||
|
||||
for(var/low_priority_bounty in low_priority_strict_type_list)
|
||||
try_add_bounty(new low_priority_bounty)
|
||||
|
||||
/proc/completed_bounty_count()
|
||||
var/count = 0
|
||||
for(var/i in GLOB.bounties_list)
|
||||
var/datum/bounty/B = i
|
||||
if(B.claimed)
|
||||
++count
|
||||
return count
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
#define PRINTER_TIMEOUT 10
|
||||
|
||||
|
||||
|
||||
/obj/machinery/computer/bounty
|
||||
name = "Nanotrasen bounty console"
|
||||
desc = "Used to check and claim bounties offered by Nanotrasen"
|
||||
icon_screen = "bounty"
|
||||
circuit = /obj/item/circuitboard/computer/bounty
|
||||
light_color = "#E2853D"//orange
|
||||
var/printer_ready = 0 //cooldown var
|
||||
|
||||
/obj/machinery/computer/bounty/Initialize()
|
||||
. = ..()
|
||||
printer_ready = world.time + PRINTER_TIMEOUT
|
||||
|
||||
/obj/machinery/computer/bounty/proc/print_paper()
|
||||
new /obj/item/paper/bounty_printout(loc)
|
||||
|
||||
/obj/item/paper/bounty_printout
|
||||
name = "paper - Bounties"
|
||||
|
||||
/obj/item/paper/bounty_printout/Initialize()
|
||||
. = ..()
|
||||
info = "<h2>Nanotrasen Cargo Bounties</h2></br>"
|
||||
for(var/datum/bounty/B in GLOB.bounties_list)
|
||||
if(B.claimed)
|
||||
continue
|
||||
info += {"<h3>[B.name]</h3>
|
||||
<ul><li>Reward: [B.reward_string()]</li>
|
||||
<li>Completed: [B.completion_string()]</li></ul>"}
|
||||
|
||||
/obj/machinery/computer/bounty/ui_interact(mob/user)
|
||||
. = ..()
|
||||
|
||||
if(!GLOB.bounties_list.len)
|
||||
setup_bounties()
|
||||
|
||||
var/list/dat = list({"<a href='?src=[REF(src)];refresh=1'>Refresh</a>
|
||||
<a href='?src=[REF(src)];refresh=1;choice=Print'>Print Paper</a>
|
||||
<p>Credits: <b>[SSshuttle.points]</b></p>
|
||||
<table style="text-align:center;" border="1" cellspacing="0" width="100%">
|
||||
<tr><th>Name</th><th>Description</th><th>Reward</th><th>Completion</th><th>Status</th></tr>"})
|
||||
for(var/datum/bounty/B in GLOB.bounties_list)
|
||||
if(B.claimed)
|
||||
dat += "<tr style='background-color:#294675;'>"
|
||||
else if(B.can_claim())
|
||||
dat += "<tr style='background-color:#4F7529;'>"
|
||||
else
|
||||
dat += "<tr style='background-color:#990000;'>"
|
||||
if(B.high_priority)
|
||||
dat += {"<td><b>[B.name]</b></td>
|
||||
<td><b>High Priority:</b> [B.description]</td>
|
||||
<td><b>[B.reward_string()]</b></td>"}
|
||||
else
|
||||
dat += {"<td>[B.name]</td>
|
||||
<td>[B.description]</td>
|
||||
<td>[B.reward_string()]</td>"}
|
||||
dat += "<td>[B.completion_string()]</td>"
|
||||
if(B.claimed)
|
||||
dat += "<td>Claimed</td>"
|
||||
else if(B.can_claim())
|
||||
dat += "<td><A href='?src=[REF(src)];refresh=1;choice=Claim;d_rec=[REF(B)]'>Claim</a></td>"
|
||||
else
|
||||
dat += "<td>Unclaimed</td>"
|
||||
dat += "</tr>"
|
||||
dat += "</table>"
|
||||
dat = dat.Join()
|
||||
var/datum/browser/popup = new(user, "bounties", "Nanotrasen Bounties", 700, 600)
|
||||
popup.set_content(dat)
|
||||
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
|
||||
popup.open()
|
||||
|
||||
/obj/machinery/computer/bounty/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
switch(href_list["choice"])
|
||||
if("Print")
|
||||
if(printer_ready < world.time)
|
||||
printer_ready = world.time + PRINTER_TIMEOUT
|
||||
print_paper()
|
||||
|
||||
if("Claim")
|
||||
var/datum/bounty/B = locate(href_list["d_rec"])
|
||||
if(B in GLOB.bounties_list)
|
||||
B.claim()
|
||||
|
||||
if(href_list["refresh"])
|
||||
playsound(src, "terminal_type", 25, 0)
|
||||
|
||||
updateUsrDialog()
|
||||
@@ -0,0 +1,511 @@
|
||||
//The Great and Mighty CentCom Pod Launcher - MrDoomBringer
|
||||
//This was originally created as a way to get adminspawned items to the station in an IC manner. It's evolved to contain a few more
|
||||
//features such as item removal, smiting, controllable delivery mobs, and more.
|
||||
|
||||
//This works by creating a supplypod (refered to as temp_pod) in a special room in the centcom map.
|
||||
//IMPORTANT: Even though we call it a supplypod for our purposes, it can take on the appearance and function of many other things: Eg. cruise missiles, boxes, or walking, living gondolas.
|
||||
//When the user launched the pod, items from special "bays" on the centcom map are taken and put into the supplypod
|
||||
|
||||
//The user can change properties of the supplypod using the UI, and change the way that items are taken from the bay (One at a time, ordered, random, etc)
|
||||
//Many of the effects of the supplypod set here are put into action in supplypod.dm
|
||||
|
||||
/client/proc/centcom_podlauncher() //Creates a verb for admins to open up the ui
|
||||
set name = "Config/Launch Supplypod"
|
||||
set desc = "Configure and launch a Centcom supplypod full of whatever your heart desires!"
|
||||
set category = "Admin"
|
||||
var/datum/centcom_podlauncher/plaunch = new(usr)//create the datum
|
||||
plaunch.ui_interact(usr)//datum has a tgui component, here we open the window
|
||||
|
||||
//Variables declared to change how items in the launch bay are picked and launched. (Almost) all of these are changed in the ui_act proc
|
||||
//Some effect groups are choices, while other are booleans. This is because some effects can stack, while others dont (ex: you can stack explosion and quiet, but you cant stack ordered launch and random launch)
|
||||
/datum/centcom_podlauncher
|
||||
var/static/list/ignored_atoms = typecacheof(list(null, /mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object, /obj/effect/particle_effect/sparks, /obj/effect/DPtarget, /obj/effect/supplypod_selector ))
|
||||
var/turf/oldTurf //Keeps track of where the user was at if they use the "teleport to centcom" button, so they can go back
|
||||
var/client/holder //client of whoever is using this datum
|
||||
var/area/bay //What bay we're using to launch shit from.
|
||||
var/launchClone = FALSE //If true, then we don't actually launch the thing in the bay. Instead we call duplicateObject() and send the result
|
||||
var/launchChoice = 1 //Determines if we launch all at once (0) , in order (1), or at random(2)
|
||||
var/explosionChoice = 0 //Determines if there is no explosion (0), custom explosion (1), or just do a maxcap (2)
|
||||
var/damageChoice = 0 //Determines if we do no damage (0), custom amnt of damage (1), or gib + 5000dmg (2)
|
||||
var/launcherActivated = FALSE //check if we've entered "launch mode" (when we click a pod is launched). Used for updating mouse cursor
|
||||
var/effectBurst = FALSE //Effect that launches 5 at once in a 3x3 area centered on the target
|
||||
var/numTurfs = 0 //Counts the number of turfs with things we can launch in the chosen bay (in the centcom map)
|
||||
var/launchCounter = 1 //Used with the "Ordered" launch mode (launchChoice = 1) to see what item is launched
|
||||
var/specificTarget //Do we want to target a specific mob instead of where we click? Also used for smiting
|
||||
var/list/orderedArea = list() //Contains an ordered list of turfs in an area (filled in the createOrderedArea() proc), read top-left to bottom-right. Used for the "ordered" launch mode (launchChoice = 1)
|
||||
var/list/turf/acceptableTurfs = list() //Contians a list of turfs (in the "bay" area on centcom) that have items that can be launched. Taken from orderedArea
|
||||
var/list/launchList = list() //Contains whatever is going to be put in the supplypod and fired. Taken from acceptableTurfs
|
||||
var/obj/effect/supplypod_selector/selector = new() //An effect used for keeping track of what item is going to be launched when in "ordered" mode (launchChoice = 1)
|
||||
var/obj/structure/closet/supplypod/centcompod/temp_pod //The temporary pod that is modified by this datum, then cloned. The buildObject() clone of this pod is what is launched
|
||||
|
||||
/datum/centcom_podlauncher/New(H)//H can either be a client or a mob due to byondcode(tm)
|
||||
if (istype(H,/client))
|
||||
var/client/C = H
|
||||
holder = C //if its a client, assign it to holder
|
||||
else
|
||||
var/mob/M = H
|
||||
holder = M.client //if its a mob, assign the mob's client to holder
|
||||
bay = locate(/area/centcom/supplypod/loading/one) in GLOB.sortedAreas //Locate the default bay (one) from the centcom map
|
||||
temp_pod = new(locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas) //Create a new temp_pod in the podStorage area on centcom (so users are free to look at it and change other variables if needed)
|
||||
orderedArea = createOrderedArea(bay) //Order all the turfs in the selected bay (top left to bottom right) to a single list. Used for the "ordered" mode (launchChoice = 1)
|
||||
|
||||
/datum/centcom_podlauncher/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, \
|
||||
force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.admin_state)//ui_interact is called when the client verb is called.
|
||||
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "centcom_podlauncher", "Config/Launch Supplypod", 700, 700, master_ui, state)
|
||||
ui.open()
|
||||
|
||||
/datum/centcom_podlauncher/ui_data(mob/user) //Sends info about the pod to the UI.
|
||||
var/list/data = list() //*****NOTE*****: Many of these comments are similarly described in supplypod.dm. If you change them here, please consider doing so in the supplypod code as well!
|
||||
var/B = (istype(bay, /area/centcom/supplypod/loading/one)) ? 1 : (istype(bay, /area/centcom/supplypod/loading/two)) ? 2 : (istype(bay, /area/centcom/supplypod/loading/three)) ? 3 : (istype(bay, /area/centcom/supplypod/loading/four)) ? 4 : 0 //top ten THICCEST FUCKING TERNARY CONDITIONALS OF 2036
|
||||
data["bay"] = B //Holds the current bay the user is launching objects from. Bays are specific rooms on the centcom map.
|
||||
data["oldArea"] = (oldTurf ? get_area(oldTurf) : null) //Holds the name of the area that the user was in before using the teleportCentcom action
|
||||
data["launchClone"] = launchClone //Do we launch the actual items in the bay or just launch clones of them?
|
||||
data["launchChoice"] = launchChoice //Launch turfs all at once (0), ordered (1), or randomly(1)
|
||||
data["explosionChoice"] = explosionChoice //An explosion that occurs when landing. Can be no explosion (0), custom explosion (1), or maxcap (2)
|
||||
data["damageChoice"] = damageChoice //Damage that occurs to any mob under the pod when it lands. Can be no damage (0), custom damage (1), or gib+5000dmg (2)
|
||||
data["landingDelay"] = temp_pod.landingDelay //How long the pod takes to land after launching
|
||||
data["openingDelay"] = temp_pod.openingDelay //How long the pod takes to open after landing
|
||||
data["departureDelay"] = temp_pod.departureDelay //How long the pod takes to leave after opening (if bluespace=true, it deletes. if reversing=true, it flies back to centcom)
|
||||
data["styleChoice"] = temp_pod.style //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the POD_STYLES list in cargo.dm defines to get the proper icon/name/desc for the pod.
|
||||
data["effectStun"] = temp_pod.effectStun //If true, stuns anyone under the pod when it launches until it lands, forcing them to get hit by the pod. Devilish!
|
||||
data["effectLimb"] = temp_pod.effectLimb //If true, pops off a limb (if applicable) from anyone caught under the pod when it lands
|
||||
data["effectBluespace"] = temp_pod.bluespace //If true, the pod deletes (in a shower of sparks) after landing
|
||||
data["effectStealth"] = temp_pod.effectStealth //If true, a target icon isnt displayed on the turf where the pod will land
|
||||
data["effectQuiet"] = temp_pod.effectQuiet //The female sniper. If true, the pod makes no noise (including related explosions, opening sounds, etc)
|
||||
data["effectMissile"] = temp_pod.effectMissile //If true, the pod deletes the second it lands. If you give it an explosion, it will act like a missile exploding as it hits the ground
|
||||
data["effectCircle"] = temp_pod.effectCircle //If true, allows the pod to come in at any angle. Bit of a weird feature but whatever its here
|
||||
data["effectBurst"] = effectBurst //IOf true, launches five pods at once (with a very small delay between for added coolness), in a 3x3 area centered around the area
|
||||
data["effectReverse"] = temp_pod.reversing //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom
|
||||
data["effectTarget"] = specificTarget //Launches the pod at the turf of a specific mob target, rather than wherever the user clicked. Useful for smites
|
||||
data["effectName"] = temp_pod.adminNamed //Determines whether or not the pod has been named by an admin. If true, the pod's name will not get overridden when the style of the pod changes (changing the style of the pod normally also changes the name+desc)
|
||||
data["giveLauncher"] = launcherActivated //If true, the user is in launch mode, and whenever they click a pod will be launched (either at their mouse position or at a specific target)
|
||||
data["numObjects"] = numTurfs //Counts the number of turfs that contain a launchable object in the centcom supplypod bay
|
||||
data["landingSound"] = temp_pod.landingSound //Admin sound to play when the pod lands
|
||||
data["openingSound"] = temp_pod.openingSound //Admin sound to play when the pod opens
|
||||
data["leavingSound"] = temp_pod.leavingSound //Admin sound to play when the pod leaves
|
||||
data["soundVolume"] = temp_pod.soundVolume != 50 //Admin sound to play when the pod leaves
|
||||
return data
|
||||
|
||||
/datum/centcom_podlauncher/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
switch(action)
|
||||
////////////////////////////UTILITIES//////////////////
|
||||
if("bay1")
|
||||
bay = locate(/area/centcom/supplypod/loading/one) in GLOB.sortedAreas //set the "bay" variable to the corresponding room in centcom
|
||||
refreshBay() //calls refreshBay() which "recounts" the bay to see what items we can launch (among other things).
|
||||
. = TRUE
|
||||
if("bay2")
|
||||
bay = locate(/area/centcom/supplypod/loading/two) in GLOB.sortedAreas
|
||||
refreshBay()
|
||||
. = TRUE
|
||||
if("bay3")
|
||||
bay = locate(/area/centcom/supplypod/loading/three) in GLOB.sortedAreas
|
||||
refreshBay()
|
||||
. = TRUE
|
||||
if("bay4")
|
||||
bay = locate(/area/centcom/supplypod/loading/four) in GLOB.sortedAreas
|
||||
refreshBay()
|
||||
. = TRUE
|
||||
if("teleportCentcom") //Teleports the user to the centcom supply loading facility.
|
||||
var/mob/M = holder.mob //We teleport whatever mob the client is attached to at the point of clicking
|
||||
oldTurf = get_turf(M) //Used for the "teleportBack" action
|
||||
var/area/A = locate(/area/centcom/supplypod/loading) in GLOB.sortedAreas
|
||||
var/list/turfs = list()
|
||||
for(var/turf/T in A)
|
||||
turfs.Add(T) //Fill a list with turfs in the area
|
||||
var/turf/T = safepick(turfs) //Only teleport if the list isn't empty
|
||||
if(!T) //If the list is empty, error and cancel
|
||||
to_chat(M, "Nowhere to jump to!")
|
||||
return
|
||||
M.forceMove(T) //Perform the actual teleport
|
||||
log_admin("[key_name(usr)] jumped to [AREACOORD(A)]")
|
||||
message_admins("[key_name_admin(usr)] jumped to [AREACOORD(A)]")
|
||||
. = TRUE
|
||||
if("teleportBack") //After teleporting to centcom, this button allows the user to teleport to the last spot they were at.
|
||||
var/mob/M = holder.mob
|
||||
if (!oldTurf) //If theres no turf to go back to, error and cancel
|
||||
to_chat(M, "Nowhere to jump to!")
|
||||
return
|
||||
M.forceMove(oldTurf) //Perform the actual teleport
|
||||
log_admin("[key_name(usr)] jumped to [AREACOORD(oldTurf)]")
|
||||
message_admins("[key_name_admin(usr)] jumped to [AREACOORD(oldTurf)]")
|
||||
. = TRUE
|
||||
|
||||
////////////////////////////LAUNCH STYLE CHANGES//////////////////
|
||||
if("launchClone") //Toggles the launchClone var. See variable declarations above for what this specifically means
|
||||
launchClone = !launchClone
|
||||
. = TRUE
|
||||
if("launchOrdered") //Launch turfs (from the orderedArea list) one at a time in order, from the supplypod bay at centcom
|
||||
if (launchChoice == 1) //launchChoice 1 represents ordered. If we push "ordered" and it already is, then we go to default value
|
||||
launchChoice = 0
|
||||
updateSelector() //Move the selector effect to the next object that will be launched. See variable declarations for more info on the selector effect.
|
||||
return
|
||||
launchChoice = 1
|
||||
updateSelector()
|
||||
. = TRUE
|
||||
if("launchRandom") //Pick random turfs from the supplypod bay at centcom to launch
|
||||
if (launchChoice == 2)
|
||||
launchChoice = 0
|
||||
updateSelector()
|
||||
return
|
||||
launchChoice = 2
|
||||
updateSelector()
|
||||
. = TRUE
|
||||
|
||||
////////////////////////////POD EFFECTS//////////////////
|
||||
if("explosionCustom") //Creates an explosion when the pod lands
|
||||
if (explosionChoice == 1) //If already a custom explosion, set to default (no explosion)
|
||||
explosionChoice = 0
|
||||
temp_pod.explosionSize = list(0,0,0,0)
|
||||
return
|
||||
var/list/expNames = list("Devastation", "Heavy Damage", "Light Damage", "Flame") //Explosions have a range of different types of damage
|
||||
var/list/boomInput = list()
|
||||
for (var/i=1 to expNames.len) //Gather input from the user for the value of each type of damage
|
||||
boomInput.Add(input("[expNames[i]] Range", "Enter the [expNames[i]] range of the explosion. WARNING: This ignores the bomb cap!", 0) as null|num)
|
||||
if (isnull(boomInput[i]))
|
||||
return
|
||||
if (!isnum(boomInput[i])) //If the user doesn't input a number, set that specific explosion value to zero
|
||||
alert(usr, "That wasnt a number! Value set to default (zero) instead.")
|
||||
boomInput = 0
|
||||
explosionChoice = 1
|
||||
temp_pod.explosionSize = boomInput
|
||||
. = TRUE
|
||||
if("explosionBus") //Creates a maxcap when the pod lands
|
||||
if (explosionChoice == 2) //If already a maccap, set to default (no explosion)
|
||||
explosionChoice = 0
|
||||
temp_pod.explosionSize = list(0,0,0,0)
|
||||
return
|
||||
explosionChoice = 2
|
||||
temp_pod.explosionSize = list(GLOB.MAX_EX_DEVESTATION_RANGE, GLOB.MAX_EX_HEAVY_RANGE, GLOB.MAX_EX_LIGHT_RANGE,GLOB.MAX_EX_FLAME_RANGE) //Set explosion to max cap of server
|
||||
. = TRUE
|
||||
if("damageCustom") //Deals damage to whoevers under the pod when it lands
|
||||
if (damageChoice == 1) //If already doing custom damage, set back to default (no damage)
|
||||
damageChoice = 0
|
||||
temp_pod.damage = 0
|
||||
return
|
||||
var/damageInput = input("How much damage to deal", "Enter the amount of brute damage dealt by getting hit", 0) as null|num
|
||||
if (isnull(damageInput))
|
||||
return
|
||||
if (!isnum(damageInput)) //Sanitize the input for damage to deal.s
|
||||
alert(usr, "That wasnt a number! Value set to default (zero) instead.")
|
||||
damageInput = 0
|
||||
damageChoice = 1
|
||||
temp_pod.damage = damageInput
|
||||
. = TRUE
|
||||
if("damageGib") //Gibs whoever is under the pod when it lands. Also deals 5000 damage, just to be sure.
|
||||
if (damageChoice == 2) //If already gibbing, set back to default (no damage)
|
||||
damageChoice = 0
|
||||
temp_pod.damage = 0
|
||||
temp_pod.effectGib = FALSE
|
||||
return
|
||||
damageChoice = 2
|
||||
temp_pod.damage = 5000
|
||||
temp_pod.effectGib = TRUE //Gibs whoever is under the pod when it lands
|
||||
. = TRUE
|
||||
if("effectName") //Give the supplypod a custom name. Supplypods automatically get their name based on their style (see supplypod/setStyle() proc), so doing this overrides that.
|
||||
if (temp_pod.adminNamed) //If we're already adminNamed, set the name of the pod back to default
|
||||
temp_pod.adminNamed = FALSE
|
||||
temp_pod.setStyle(temp_pod.style) //This resets the name of the pod based on it's current style (see supplypod/setStyle() proc)
|
||||
return
|
||||
var/nameInput= input("Custom name", "Enter a custom name", POD_STYLES[temp_pod.style][POD_NAME]) as null|text //Gather input for name and desc
|
||||
if (isnull(nameInput))
|
||||
return
|
||||
var/descInput = input("Custom description", "Enter a custom desc", POD_STYLES[temp_pod.style][POD_DESC]) as null|text //The POD_STYLES is used to get the name, desc, or icon state based on the pod's style
|
||||
if (isnull(descInput))
|
||||
return
|
||||
temp_pod.name = nameInput
|
||||
temp_pod.desc = descInput
|
||||
temp_pod.adminNamed = TRUE //This variable is checked in the supplypod/setStyle() proc
|
||||
. = TRUE
|
||||
if("effectStun") //Toggle: Any mob under the pod is stunned (cant move) until the pod lands, hitting them!
|
||||
temp_pod.effectStun = !temp_pod.effectStun
|
||||
. = TRUE
|
||||
if("effectLimb") //Toggle: Anyone carbon mob under the pod loses a limb when it lands
|
||||
temp_pod.effectLimb = !temp_pod.effectLimb
|
||||
. = TRUE
|
||||
if("effectBluespace") //Toggle: Deletes the pod after landing
|
||||
temp_pod.bluespace = !temp_pod.bluespace
|
||||
. = TRUE
|
||||
if("effectStealth") //Toggle: There is no red target indicator showing where the pod will land
|
||||
temp_pod.effectStealth = !temp_pod.effectStealth
|
||||
. = TRUE
|
||||
if("effectQuiet") //Toggle: The pod makes no noise (explosions, opening sounds, etc)
|
||||
temp_pod.effectQuiet = !temp_pod.effectQuiet
|
||||
. = TRUE
|
||||
if("effectMissile") //Toggle: The pod deletes the instant it lands. Looks nicer than just setting the open delay and leave delay to zero. Useful for combo-ing with explosions
|
||||
temp_pod.effectMissile = !temp_pod.effectMissile
|
||||
. = TRUE
|
||||
if("effectCircle") //Toggle: The pod can come in from any descent angle. Goof requested this im not sure why but it looks p funny actually
|
||||
temp_pod.effectCircle = !temp_pod.effectCircle
|
||||
. = TRUE
|
||||
if("effectBurst") //Toggle: Launch 5 pods (with a very slight delay between) in a 3x3 area centered around the target
|
||||
effectBurst = !effectBurst
|
||||
. = TRUE
|
||||
if("effectReverse") //Toggle: Don't send any items. Instead, after landing, close (taking any objects inside) and go back to the centcom bay it came from
|
||||
temp_pod.reversing = !temp_pod.reversing
|
||||
. = TRUE
|
||||
if("effectTarget") //Toggle: Launch at a specific mob (instead of at whatever turf you click on). Used for the supplypod smite
|
||||
if (specificTarget)
|
||||
specificTarget = null
|
||||
return
|
||||
var/list/mobs = getpois()//code stolen from observer.dm
|
||||
var/inputTarget = input("Select a mob! (Smiting does this automatically)", "Target", null, null) as null|anything in mobs
|
||||
if (isnull(inputTarget))
|
||||
return
|
||||
var/mob/target = mobs[inputTarget]
|
||||
specificTarget = target///input specific tartget
|
||||
. = TRUE
|
||||
|
||||
////////////////////////////TIMER DELAYS//////////////////
|
||||
if("landingDelay") //Change the time it takes the pod to land, after firing
|
||||
if (temp_pod.landingDelay != initial(temp_pod.landingDelay)) //If the landing delay has already been changed when we push the "change value" button, then set it to default
|
||||
temp_pod.landingDelay = initial(temp_pod.landingDelay)
|
||||
return
|
||||
var/timeInput = input("Delay Time", "Enter the time it takes for the pod to land, in seconds", 0.5) as null|num
|
||||
if (isnull(timeInput))
|
||||
return
|
||||
if (!isnum(timeInput)) //Sanitize input, if it doesnt check out, error and set to default
|
||||
alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.landingDelay)*0.1]) instead.")
|
||||
timeInput = initial(temp_pod.landingDelay)
|
||||
temp_pod.landingDelay = 10 * timeInput
|
||||
. = TRUE
|
||||
if("openingDelay") //Change the time it takes the pod to open it's door (and release its contents) after landing
|
||||
if (temp_pod.openingDelay != initial(temp_pod.openingDelay)) //If the opening delay has already been changed when we push the "change value" button, then set it to default
|
||||
temp_pod.openingDelay = initial(temp_pod.openingDelay)
|
||||
return
|
||||
var/timeInput = input("Delay Time", "Enter the time it takes for the pod to open after landing, in seconds", 3) as null|num
|
||||
if (isnull(timeInput))
|
||||
return
|
||||
if (!isnum(timeInput)) //Sanitize input
|
||||
alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.openingDelay)*0.1]) instead.")
|
||||
timeInput = initial(temp_pod.openingDelay)
|
||||
temp_pod.openingDelay = 10 * timeInput
|
||||
. = TRUE
|
||||
if("departureDelay") //Change the time it takes the pod to leave (if bluespace = true it just deletes, if effectReverse = true it goes back to centcom)
|
||||
if (temp_pod.departureDelay != initial(temp_pod.departureDelay)) //If the departure delay has already been changed when we push the "change value" button, then set it to default
|
||||
temp_pod.departureDelay = initial(temp_pod.departureDelay)
|
||||
return
|
||||
var/timeInput = input("Delay Time", "Enter the time it takes for the pod to leave after opening, in seconds", 3) as null|num
|
||||
if (isnull(timeInput))
|
||||
return
|
||||
if (!isnum(timeInput))
|
||||
alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.departureDelay)*0.1]) instead.")
|
||||
timeInput = initial(temp_pod.departureDelay)
|
||||
temp_pod.departureDelay = 10 * timeInput
|
||||
. = TRUE
|
||||
|
||||
////////////////////////////ADMIN SOUNDS//////////////////
|
||||
if("landingSound") //Admin sound from a local file that plays when the pod lands
|
||||
if (!isnull(temp_pod.landingSound))
|
||||
temp_pod.landingSound = null
|
||||
return
|
||||
temp_pod.landingSound = input(holder, "Please pick a sound file to play when the pod lands! I reccomend a nice \"oh shit, i'm sorry\", incase you hit someone with the pod.", "Pick a Sound File") as null|sound
|
||||
. = TRUE
|
||||
if("openingSound") //Admin sound from a local file that plays when the pod opens
|
||||
if (!isnull(temp_pod.openingSound))
|
||||
temp_pod.openingSound = null
|
||||
return
|
||||
temp_pod.openingSound = input(holder, "Please pick a sound file to play when the pod opens! I reccomend a stock sound effect of kids cheering at a party, incase your pod is full of fun exciting stuff!", "Pick a Sound File") as null|sound
|
||||
. = TRUE
|
||||
if("leavingSound") //Admin sound from a local file that plays when the pod leaves
|
||||
if (!isnull(temp_pod.leavingSound))
|
||||
temp_pod.leavingSound = null
|
||||
return
|
||||
temp_pod.leavingSound = input(holder, "Please pick a sound file to play when the pod leaves! I reccomend a nice slide whistle sound, especially if you're using the reverse pod effect.", "Pick a Sound File") as null|sound
|
||||
. = TRUE
|
||||
if("soundVolume") //Admin sound from a local file that plays when the pod leaves
|
||||
if (temp_pod.soundVolume != 50)
|
||||
temp_pod.soundVolume = 50
|
||||
return
|
||||
temp_pod.soundVolume = input(holder, "Please pick a volume. Default is between 1 and 100 with 50 being average, but pick whatever. I'm a notification, not a cop. If you still cant hear your sound, consider turning on the Quiet effect. It will silence all pod sounds except for the custom admin ones set by the previous three buttons.", "Pick Admin Sound Volume") as null|num
|
||||
if (isnull(temp_pod.soundVolume))
|
||||
temp_pod.soundVolume = 50
|
||||
. = TRUE
|
||||
////////////////////////////STYLE CHANGES//////////////////
|
||||
//Style is a value that is used to keep track of what the pod is supposed to look like. It can be used with the POD_STYLES list (in cargo.dm defines)
|
||||
//as a way to get the proper icon state, name, and description of the pod.
|
||||
if("styleStandard")
|
||||
temp_pod.setStyle(STYLE_STANDARD)
|
||||
. = TRUE
|
||||
if("styleBluespace")
|
||||
temp_pod.setStyle(STYLE_BLUESPACE)
|
||||
. = TRUE
|
||||
if("styleSyndie")
|
||||
temp_pod.setStyle(STYLE_SYNDICATE)
|
||||
. = TRUE
|
||||
if("styleBlue")
|
||||
temp_pod.setStyle(STYLE_BLUE)
|
||||
. = TRUE
|
||||
if("styleCult")
|
||||
temp_pod.setStyle(STYLE_CULT)
|
||||
. = TRUE
|
||||
if("styleMissile")
|
||||
temp_pod.setStyle(STYLE_MISSILE)
|
||||
. = TRUE
|
||||
if("styleSMissile")
|
||||
temp_pod.setStyle(STYLE_RED_MISSILE)
|
||||
. = TRUE
|
||||
if("styleBox")
|
||||
temp_pod.setStyle(STYLE_BOX)
|
||||
. = TRUE
|
||||
if("styleHONK")
|
||||
temp_pod.setStyle(STYLE_HONK)
|
||||
. = TRUE
|
||||
if("styleFruit")
|
||||
temp_pod.setStyle(STYLE_FRUIT)
|
||||
. = TRUE
|
||||
if("styleInvisible")
|
||||
temp_pod.setStyle(STYLE_INVISIBLE)
|
||||
. = TRUE
|
||||
if("styleGondola")
|
||||
temp_pod.setStyle(STYLE_GONDOLA)
|
||||
. = TRUE
|
||||
if("refresh") //Refresh the Pod bay. User should press this if they spawn something new in the centcom bay. Automatically called whenever the user launches a pod
|
||||
refreshBay()
|
||||
. = TRUE
|
||||
if("giveLauncher") //Enters the "Launch Mode". When the launcher is activated, temp_pod is cloned, and the result it filled and launched anywhere the user clicks (unless specificTarget is true)
|
||||
launcherActivated = !launcherActivated
|
||||
updateCursor(launcherActivated) //Update the cursor of the user to a cool looking target icon
|
||||
. = TRUE
|
||||
|
||||
/datum/centcom_podlauncher/ui_close() //Uses the destroy() proc. When the user closes the UI, we clean up the temp_pod and supplypod_selector variables.
|
||||
qdel(src)
|
||||
|
||||
/datum/centcom_podlauncher/proc/updateCursor(var/launching) //Update the moues of the user
|
||||
if (holder) //Check to see if we have a client
|
||||
if (launching) //If the launching param is true, we give the user new mouse icons.
|
||||
holder.mouse_up_icon = 'icons/effects/supplypod_target.dmi' //Icon for when mouse is released
|
||||
holder.mouse_down_icon = 'icons/effects/supplypod_down_target.dmi' //Icon for when mouse is pressed
|
||||
holder.mouse_pointer_icon = holder.mouse_up_icon //Icon for idle mouse (same as icon for when released)
|
||||
holder.click_intercept = src //Create a click_intercept so we know where the user is clicking
|
||||
else
|
||||
var/mob/M = holder.mob
|
||||
holder.mouse_up_icon = null
|
||||
holder.mouse_down_icon = null
|
||||
holder.click_intercept = null
|
||||
if (M)
|
||||
M.update_mouse_pointer() //set the moues icons to null, then call update_moues_pointer() which resets them to the correct values based on what the mob is doing (in a mech, holding a spell, etc)()
|
||||
|
||||
/datum/centcom_podlauncher/proc/InterceptClickOn(user,params,atom/target) //Click Intercept so we know where to send pods where the user clicks
|
||||
var/list/pa = params2list(params)
|
||||
var/left_click = pa.Find("left")
|
||||
if (launcherActivated)
|
||||
//Clicking on UI elements shouldn't launch a pod
|
||||
if(istype(target,/obj/screen))
|
||||
return FALSE
|
||||
|
||||
. = TRUE
|
||||
|
||||
if(left_click) //When we left click:
|
||||
preLaunch() //Fill the acceptableTurfs list from the orderedArea list. Then, fill up the launchList list with items from the acceptableTurfs list based on the manner of launch (ordered, random, etc)
|
||||
if (!isnull(specificTarget))
|
||||
target = get_turf(specificTarget) //if we have a specific mob target, then always launch the pod at the turf of the mob
|
||||
else if (target)
|
||||
target = get_turf(target) //Make sure we're aiming at a turf rather than an item or effect or something
|
||||
else
|
||||
return //if target is null and we don't have a specific target, cancel
|
||||
|
||||
if (!effectBurst) //If we're not using burst mode, just launch normally.
|
||||
launch(target)
|
||||
else
|
||||
for (var/i in 1 to 5) //If we're using burst mode, launch 5 pods
|
||||
if (isnull(target))
|
||||
break //if our target gets deleted during this, we stop the show
|
||||
preLaunch() //Same as above
|
||||
var/LZ = locate(target.x + rand(-1,1), target.y + rand(-1,1), target.z) //Pods are randomly adjacent to (or the same as) the target
|
||||
if (LZ) //just incase we're on the edge of the map or something that would cause target.x+1 to fail
|
||||
launch(LZ) //launch the pod at the adjacent turf
|
||||
else
|
||||
launch(target) //If we couldn't locate an adjacent turf, just launch at the normal target
|
||||
sleep(rand()*2) //looks cooler than them all appearing at once. Gives the impression of burst fire.
|
||||
log_admin("Centcom Supplypod Launch: [key_name(user)] launched a supplypod in [AREACOORD(target)]")
|
||||
|
||||
/datum/centcom_podlauncher/proc/refreshBay() //Called whenever the bay is switched, as well as wheneber a pod is launched
|
||||
orderedArea = createOrderedArea(bay) //Create an ordered list full of turfs form the bay
|
||||
preLaunch() //Fill acceptable turfs from orderedArea, then fill launchList from acceptableTurfs (see proc for more info)
|
||||
|
||||
/datum/centcom_podlauncher/proc/createOrderedArea(area/A) //This assumes the area passed in is a continuous square
|
||||
if (isnull(A)) //If theres no supplypod bay mapped into centcom, throw an error
|
||||
to_chat(holder.mob, "No /area/centcom/supplypod/loading/one (or /two or /three or /four) in the world! You can make one yourself (then refresh) for now, but yell at a mapper to fix this, today!")
|
||||
CRASH("No /area/centcom/supplypod/loading/one (or /two or /three or /four) has been mapped into the centcom z-level!")
|
||||
return
|
||||
orderedArea = list()
|
||||
if (!isemptylist(A.contents)) //Go through the area passed into the proc, and figure out the top left and bottom right corners by calculating max and min values
|
||||
var/startX = A.contents[1].x //Create the four values (we do it off a.contents[1] so they have some sort of arbitrary initial value. They should be overwritten in a few moments)
|
||||
var/endX = A.contents[1].x
|
||||
var/startY = A.contents[1].y
|
||||
var/endY = A.contents[1].y
|
||||
for (var/turf/T in A) //For each turf in the area, go through and find:
|
||||
if (T.x < startX) //The turf with the smallest x value. This is our startX
|
||||
startX = T.x
|
||||
else if (T.x > endX) //The turf with the largest x value. This is our endX
|
||||
endX = T.x
|
||||
else if (T.y > startY) //The turf with the largest Y value. This is our startY
|
||||
startY = T.y
|
||||
else if (T.y < endY) //The turf with the smallest Y value. This is our endY
|
||||
endY = T.y
|
||||
for (var/i in endY to startY)
|
||||
for (var/j in startX to endX)
|
||||
orderedArea.Add(locate(j,startY - (i - endY),1)) //After gathering the start/end x and y, go through locating each turf from top left to bottom right, like one would read a book
|
||||
return orderedArea //Return the filled list
|
||||
|
||||
/datum/centcom_podlauncher/proc/preLaunch() //Creates a list of acceptable items,
|
||||
numTurfs = 0 //Counts the number of turfs that can be launched (remember, supplypods either launch all at once or one turf-worth of items at a time)
|
||||
acceptableTurfs = list()
|
||||
for (var/turf/T in orderedArea) //Go through the orderedArea list
|
||||
if (typecache_filter_list_reverse(T.contents, ignored_atoms).len != 0) //if there is something in this turf that isnt in the blacklist, we consider this turf "acceptable" and add it to the acceptableTurfs list
|
||||
acceptableTurfs.Add(T) //Because orderedArea was an ordered linear list, acceptableTurfs will be as well.
|
||||
numTurfs ++
|
||||
|
||||
launchList = list() //Anything in launchList will go into the supplypod when it is launched
|
||||
if (!isemptylist(acceptableTurfs) && !temp_pod.reversing && !temp_pod.effectMissile) //We dont fill the supplypod if acceptableTurfs is empty, if the pod is going in reverse (effectReverse=true), or if the pod is acitng like a missile (effectMissile=true)
|
||||
switch(launchChoice)
|
||||
if(0) //If we are launching all the turfs at once
|
||||
for (var/turf/T in acceptableTurfs)
|
||||
launchList |= typecache_filter_list_reverse(T.contents, ignored_atoms) //We filter any blacklisted atoms and add the rest to the launchList
|
||||
if(1) //If we are launching one at a time
|
||||
if (launchCounter > acceptableTurfs.len) //Check if the launchCounter, which acts as an index, is too high. If it is, reset it to 1
|
||||
launchCounter = 1 //Note that the launchCounter index is incremented in the launch() proc
|
||||
for (var/atom/movable/O in acceptableTurfs[launchCounter].contents) //Go through the acceptableTurfs list based on the launchCounter index
|
||||
launchList |= typecache_filter_list_reverse(acceptableTurfs[launchCounter].contents, ignored_atoms) //Filter the specicic turf chosen from acceptableTurfs, and add it to the launchList
|
||||
if(2) //If we are launching randomly
|
||||
launchList |= typecache_filter_list_reverse(pick_n_take(acceptableTurfs).contents, ignored_atoms) //filter a random turf from the acceptableTurfs list and add it to the launchList
|
||||
updateSelector() //Call updateSelector(), which, if we are launching one at a time (launchChoice==2), will move to the next turf that will be launched
|
||||
//UpdateSelector() is here (instead if the if(1) switch block) because it also moves the selector to nullspace (to hide it) if needed
|
||||
|
||||
/datum/centcom_podlauncher/proc/launch(turf/A) //Game time started
|
||||
if (isnull(A))
|
||||
return
|
||||
var/obj/structure/closet/supplypod/centcompod/toLaunch = DuplicateObject(temp_pod) //Duplicate the temp_pod (which we have been varediting or configuring with the UI) and store the result
|
||||
toLaunch.bay = bay //Bay is currently a nonstatic expression, so it cant go into toLaunch using DuplicateObject
|
||||
toLaunch.update_icon()//we update_icon() here so that the door doesnt "flicker on" right after it lands
|
||||
if (launchClone) //We arent launching the actual items from the bay, rather we are creating clones and launching those
|
||||
for (var/atom/movable/O in launchList)
|
||||
DuplicateObject(O).forceMove(toLaunch) //Duplicate each atom/movable in launchList and forceMove them into the supplypod
|
||||
new /obj/effect/DPtarget(A, toLaunch) //Create the DPTarget, which will eventually forceMove the temp_pod to it's location
|
||||
else
|
||||
for (var/atom/movable/O in launchList) //If we aren't cloning the objects, just go through the launchList
|
||||
O.forceMove(toLaunch) //and forceMove any atom/moveable into the supplypod
|
||||
new /obj/effect/DPtarget(A, toLaunch) //Then, create the DPTarget effect, which will eventually forceMove the temp_pod to it's location
|
||||
if (launchClone)
|
||||
launchCounter++ //We only need to increment launchCounter if we are cloning objects.
|
||||
//If we aren't cloning objects, taking and removing the first item each time from the acceptableTurfs list will inherently iterate through the list in order
|
||||
|
||||
/datum/centcom_podlauncher/proc/updateSelector() //Ensures that the selector effect will showcase the next item if needed
|
||||
if (launchChoice == 1 && !isemptylist(acceptableTurfs) && !temp_pod.reversing && !temp_pod.effectMissile) //We only show the selector if we are taking items from the bay
|
||||
var/index = launchCounter + 1 //launchCounter acts as an index to the ordered acceptableTurfs list, so adding one will show the next item in the list
|
||||
if (index > acceptableTurfs.len) //out of bounds check
|
||||
index = 1
|
||||
selector.forceMove(acceptableTurfs[index]) //forceMove the selector to the next turf in the ordered acceptableTurfs list
|
||||
else
|
||||
selector.moveToNullspace() //Otherwise, we move the selector to nullspace until it is needed again
|
||||
|
||||
/datum/centcom_podlauncher/Destroy() //The Destroy() proc. This is called by ui_close proc, or whenever the user leaves the game
|
||||
updateCursor(FALSE) //Make sure our moues cursor resets to default. False means we are not in launch mode
|
||||
qdel(temp_pod) //Delete the temp_pod
|
||||
qdel(selector) //Delete the selector effect
|
||||
. = ..()
|
||||
@@ -0,0 +1,228 @@
|
||||
/obj/machinery/computer/cargo
|
||||
name = "supply console"
|
||||
desc = "Used to order supplies, approve requests, and control the shuttle."
|
||||
icon_screen = "supply"
|
||||
circuit = /obj/item/circuitboard/computer/cargo
|
||||
req_access = list(ACCESS_CARGO)
|
||||
var/requestonly = FALSE
|
||||
var/contraband = FALSE
|
||||
var/safety_warning = "For safety reasons, the automated supply shuttle \
|
||||
cannot transport live organisms, human remains, classified nuclear weaponry \
|
||||
or homing beacons."
|
||||
var/blockade_warning = "Bluespace instability detected. Shuttle movement impossible."
|
||||
|
||||
light_color = "#E2853D"//orange
|
||||
|
||||
/obj/machinery/computer/cargo/request
|
||||
name = "supply request console"
|
||||
desc = "Used to request supplies from cargo."
|
||||
icon_screen = "request"
|
||||
circuit = /obj/item/circuitboard/computer/cargo/request
|
||||
req_access = list()
|
||||
requestonly = TRUE
|
||||
|
||||
/obj/machinery/computer/cargo/Initialize()
|
||||
. = ..()
|
||||
var/obj/item/circuitboard/computer/cargo/board = circuit
|
||||
contraband = board.contraband
|
||||
if (board.obj_flags & EMAGGED)
|
||||
obj_flags |= EMAGGED
|
||||
else
|
||||
obj_flags &= ~EMAGGED
|
||||
|
||||
/obj/machinery/computer/cargo/proc/get_export_categories()
|
||||
. = EXPORT_CARGO
|
||||
if(contraband)
|
||||
. |= EXPORT_CONTRABAND
|
||||
if(obj_flags & EMAGGED)
|
||||
. |= EXPORT_EMAG
|
||||
|
||||
/obj/machinery/computer/cargo/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] swipes a suspicious card through [src]!</span>",
|
||||
"<span class='notice'>You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.</span>")
|
||||
|
||||
obj_flags |= EMAGGED
|
||||
contraband = TRUE
|
||||
|
||||
// This also permamently sets this on the circuit board
|
||||
var/obj/item/circuitboard/computer/cargo/board = circuit
|
||||
board.contraband = TRUE
|
||||
board.obj_flags |= EMAGGED
|
||||
req_access = list()
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/cargo/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "cargo", name, 1000, 800, master_ui, state)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/computer/cargo/ui_data()
|
||||
var/list/data = list()
|
||||
data["requestonly"] = requestonly
|
||||
data["location"] = SSshuttle.supply.getStatusText()
|
||||
data["points"] = SSshuttle.points
|
||||
data["away"] = SSshuttle.supply.getDockedId() == "supply_away"
|
||||
data["docked"] = SSshuttle.supply.mode == SHUTTLE_IDLE
|
||||
data["loan"] = !!SSshuttle.shuttle_loan
|
||||
data["loan_dispatched"] = SSshuttle.shuttle_loan && SSshuttle.shuttle_loan.dispatched
|
||||
var/message = "Remember to stamp and send back the supply manifests."
|
||||
if(SSshuttle.centcom_message)
|
||||
message = SSshuttle.centcom_message
|
||||
if(SSshuttle.supplyBlocked)
|
||||
message = blockade_warning
|
||||
data["message"] = message
|
||||
data["supplies"] = list()
|
||||
for(var/pack in SSshuttle.supply_packs)
|
||||
var/datum/supply_pack/P = SSshuttle.supply_packs[pack]
|
||||
if(!data["supplies"][P.group])
|
||||
data["supplies"][P.group] = list(
|
||||
"name" = P.group,
|
||||
"packs" = list()
|
||||
)
|
||||
if((P.hidden && !(obj_flags & EMAGGED)) || (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.DropPodOnly)
|
||||
continue
|
||||
data["supplies"][P.group]["packs"] += list(list(
|
||||
"name" = P.name,
|
||||
"cost" = P.cost,
|
||||
"id" = pack,
|
||||
"desc" = P.desc || P.name // If there is a description, use it. Otherwise use the pack's name.
|
||||
))
|
||||
|
||||
data["cart"] = list()
|
||||
for(var/datum/supply_order/SO in SSshuttle.shoppinglist)
|
||||
data["cart"] += list(list(
|
||||
"object" = SO.pack.name,
|
||||
"cost" = SO.pack.cost,
|
||||
"id" = SO.id
|
||||
))
|
||||
|
||||
data["requests"] = list()
|
||||
for(var/datum/supply_order/SO in SSshuttle.requestlist)
|
||||
data["requests"] += list(list(
|
||||
"object" = SO.pack.name,
|
||||
"cost" = SO.pack.cost,
|
||||
"orderer" = SO.orderer,
|
||||
"reason" = SO.reason,
|
||||
"id" = SO.id
|
||||
))
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui)
|
||||
if(..())
|
||||
return
|
||||
if(!allowed(usr))
|
||||
to_chat(usr, "<span class='notice'>Access denied.</span>")
|
||||
return
|
||||
if(action != "add" && requestonly)
|
||||
return
|
||||
switch(action)
|
||||
if("send")
|
||||
if(!SSshuttle.supply.canMove())
|
||||
say(safety_warning)
|
||||
return
|
||||
if(SSshuttle.supplyBlocked)
|
||||
say(blockade_warning)
|
||||
return
|
||||
if(SSshuttle.supply.getDockedId() == "supply_home")
|
||||
SSshuttle.supply.export_categories = get_export_categories()
|
||||
SSshuttle.moveShuttle("supply", "supply_away", TRUE)
|
||||
say("The supply shuttle is departing.")
|
||||
investigate_log("[key_name(usr)] sent the supply shuttle away.", INVESTIGATE_CARGO)
|
||||
else
|
||||
investigate_log("[key_name(usr)] called the supply shuttle.", INVESTIGATE_CARGO)
|
||||
say("The supply shuttle has been called and will arrive in [SSshuttle.supply.timeLeft(600)] minutes.")
|
||||
SSshuttle.moveShuttle("supply", "supply_home", TRUE)
|
||||
. = TRUE
|
||||
if("loan")
|
||||
if(!SSshuttle.shuttle_loan)
|
||||
return
|
||||
if(SSshuttle.supplyBlocked)
|
||||
say(blockade_warning)
|
||||
return
|
||||
else if(SSshuttle.supply.mode != SHUTTLE_IDLE)
|
||||
return
|
||||
else if(SSshuttle.supply.getDockedId() != "supply_away")
|
||||
return
|
||||
else
|
||||
SSshuttle.shuttle_loan.loan_shuttle()
|
||||
say("The supply shuttle has been loaned to CentCom.")
|
||||
. = TRUE
|
||||
if("add")
|
||||
var/id = text2path(params["id"])
|
||||
var/datum/supply_pack/pack = SSshuttle.supply_packs[id]
|
||||
if(!istype(pack))
|
||||
return
|
||||
if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.contraband && !contraband) || pack.DropPodOnly)
|
||||
return
|
||||
|
||||
var/name = "*None Provided*"
|
||||
var/rank = "*None Provided*"
|
||||
var/ckey = usr.ckey
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/H = usr
|
||||
name = H.get_authentification_name()
|
||||
rank = H.get_assignment(hand_first = TRUE)
|
||||
else if(issilicon(usr))
|
||||
name = usr.real_name
|
||||
rank = "Silicon"
|
||||
|
||||
var/reason = ""
|
||||
if(requestonly)
|
||||
reason = stripped_input("Reason:", name, "")
|
||||
if(isnull(reason) || ..())
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
var/datum/supply_order/SO = new(pack, name, rank, ckey, reason)
|
||||
SO.generateRequisition(T)
|
||||
if(requestonly)
|
||||
SSshuttle.requestlist += SO
|
||||
else
|
||||
SSshuttle.shoppinglist += SO
|
||||
. = TRUE
|
||||
if("remove")
|
||||
var/id = text2num(params["id"])
|
||||
for(var/datum/supply_order/SO in SSshuttle.shoppinglist)
|
||||
if(SO.id == id)
|
||||
SSshuttle.shoppinglist -= SO
|
||||
. = TRUE
|
||||
break
|
||||
if("clear")
|
||||
SSshuttle.shoppinglist.Cut()
|
||||
. = TRUE
|
||||
if("approve")
|
||||
var/id = text2num(params["id"])
|
||||
for(var/datum/supply_order/SO in SSshuttle.requestlist)
|
||||
if(SO.id == id)
|
||||
SSshuttle.requestlist -= SO
|
||||
SSshuttle.shoppinglist += SO
|
||||
. = TRUE
|
||||
break
|
||||
if("deny")
|
||||
var/id = text2num(params["id"])
|
||||
for(var/datum/supply_order/SO in SSshuttle.requestlist)
|
||||
if(SO.id == id)
|
||||
SSshuttle.requestlist -= SO
|
||||
. = TRUE
|
||||
break
|
||||
if("denyall")
|
||||
SSshuttle.requestlist.Cut()
|
||||
. = TRUE
|
||||
if(.)
|
||||
post_signal("supply")
|
||||
|
||||
/obj/machinery/computer/cargo/proc/post_signal(command)
|
||||
|
||||
var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS)
|
||||
|
||||
if(!frequency)
|
||||
return
|
||||
|
||||
var/datum/signal/status_signal = new(list("command" = command))
|
||||
frequency.post_signal(src, status_signal)
|
||||
@@ -0,0 +1,45 @@
|
||||
/obj/item/export_scanner
|
||||
name = "export scanner"
|
||||
desc = "A device used to check objects against Nanotrasen exports and bounty database. Sadly can not scan reagents vaule."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "export_scanner"
|
||||
item_state = "radio"
|
||||
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||
item_flags = NOBLUDGEON
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
siemens_coefficient = 1
|
||||
var/obj/machinery/computer/cargo/cargo_console = null
|
||||
|
||||
/obj/item/export_scanner/examine(user)
|
||||
..()
|
||||
if(!cargo_console)
|
||||
to_chat(user, "<span class='notice'>[src] is not currently linked to a cargo console.</span>")
|
||||
|
||||
/obj/item/export_scanner/afterattack(obj/O, mob/user, proximity)
|
||||
. = ..()
|
||||
if(!istype(O) || !proximity)
|
||||
return
|
||||
|
||||
if(istype(O, /obj/machinery/computer/cargo))
|
||||
var/obj/machinery/computer/cargo/C = O
|
||||
if(!C.requestonly)
|
||||
cargo_console = C
|
||||
to_chat(user, "<span class='notice'>Scanner linked to [C].</span>")
|
||||
else if(!istype(cargo_console))
|
||||
to_chat(user, "<span class='warning'>You must link [src] to a cargo console first!</span>")
|
||||
else
|
||||
// Before you fix it:
|
||||
// yes, checking manifests is a part of intended functionality.
|
||||
|
||||
var/datum/export_report/ex = export_item_and_contents(O, cargo_console.get_export_categories(), dry_run=TRUE)
|
||||
var/price = 0
|
||||
for(var/x in ex.total_amount)
|
||||
price += ex.total_value[x]
|
||||
|
||||
if(price)
|
||||
to_chat(user, "<span class='notice'>Scanned [O], value: <b>[price]</b> credits[O.contents.len ? " (contents included)" : ""].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Scanned [O], no export value.</span>")
|
||||
if(bounty_ship_item_and_contents(O, dry_run=TRUE))
|
||||
to_chat(user, "<span class='notice'>Scanned item is eligible for one or more bounties.</span>")
|
||||
@@ -0,0 +1,179 @@
|
||||
/* How it works:
|
||||
The shuttle arrives at CentCom dock and calls sell(), which recursively loops through all the shuttle contents that are unanchored.
|
||||
|
||||
Each object in the loop is checked for applies_to() of various export datums, except the invalid ones.
|
||||
*/
|
||||
|
||||
/* The rule in figuring out item export cost:
|
||||
Export cost of goods in the shipping crate must be always equal or lower than:
|
||||
packcage cost - crate cost - manifest cost
|
||||
Crate cost is 500cr for a regular plasteel crate and 100cr for a large wooden one. Manifest cost is always 200cr.
|
||||
This is to avoid easy cargo points dupes.
|
||||
|
||||
Credit dupes that require a lot of manual work shouldn't be removed, unless they yield too much profit for too little work.
|
||||
For example, if some player buys metal and glass sheets and uses them to make and sell reinforced glass:
|
||||
|
||||
100 glass + 50 metal -> 100 reinforced glass
|
||||
(1500cr -> 1600cr)
|
||||
|
||||
then the player gets the profit from selling his own wasted time.
|
||||
*/
|
||||
|
||||
// Simple holder datum to pass export results around
|
||||
/datum/export_report
|
||||
var/list/exported_atoms = list()//names of atoms sold/deleted by export
|
||||
var/list/total_amount = list() //export instance => total count of sold objects of its type, only exists if any were sold
|
||||
var/list/total_value = list() //export instance => total value of sold objects
|
||||
var/list/total_reagents = list()//export reagents => into the total vaule of the object sold
|
||||
|
||||
// external_report works as "transaction" object, pass same one in if you're doing more than one export in single go
|
||||
/proc/export_item_and_contents(atom/movable/AM, allowed_categories = EXPORT_CARGO, apply_elastic = TRUE, delete_unsold = TRUE, dry_run=FALSE, datum/export_report/external_report)
|
||||
if(!GLOB.exports_list.len)
|
||||
setupExports()
|
||||
|
||||
var/list/contents = AM.GetAllContents()
|
||||
|
||||
var/datum/export_report/report = external_report
|
||||
if(!report) //If we don't have any longer transaction going on
|
||||
report = new
|
||||
|
||||
// We go backwards, so it'll be innermost objects sold first
|
||||
for(var/i in reverseRange(contents))
|
||||
var/atom/movable/thing = i
|
||||
var/sold = FALSE
|
||||
for(var/datum/export/E in GLOB.exports_list)
|
||||
if(!E)
|
||||
continue
|
||||
if(E.applies_to(thing, allowed_categories, apply_elastic))
|
||||
sold = E.sell_object(thing, report, dry_run, allowed_categories , apply_elastic)
|
||||
report.exported_atoms += " [thing.name]"
|
||||
break
|
||||
if(thing.reagents)
|
||||
for(var/datum/reagent/R in thing.reagents.reagent_list)
|
||||
report.total_reagents[R] += R.volume
|
||||
if(!dry_run && (sold || delete_unsold))
|
||||
if(ismob(thing))
|
||||
thing.investigate_log("deleted through cargo export",INVESTIGATE_CARGO)
|
||||
qdel(thing)
|
||||
|
||||
return report
|
||||
|
||||
/datum/export
|
||||
var/unit_name = "" // Unit name. Only used in "Received [total_amount] [name]s [message]." message
|
||||
var/message = ""
|
||||
var/cost = 100 // Cost of item, in cargo credits. Must not alow for infinite price dupes, see above.
|
||||
var/k_elasticity = 1/300 //coefficient used in marginal price calculation that roughly corresponds to the inverse of price elasticity, or "quantity elasticity" - CIT EDIT 1/30 - > 0
|
||||
var/list/export_types = list() // Type of the exported object. If none, the export datum is considered base type.
|
||||
var/include_subtypes = TRUE // Set to FALSE to make the datum apply only to a strict type.
|
||||
var/list/exclude_types = list() // Types excluded from export
|
||||
|
||||
//cost includes elasticity, this does not.
|
||||
var/init_cost
|
||||
|
||||
//All these need to be present in export call parameter for this to apply.
|
||||
var/export_category = EXPORT_CARGO
|
||||
|
||||
/datum/export/New()
|
||||
..()
|
||||
SSprocessing.processing += src
|
||||
init_cost = cost
|
||||
export_types = typecacheof(export_types)
|
||||
exclude_types = typecacheof(exclude_types)
|
||||
|
||||
/datum/export/Destroy()
|
||||
SSprocessing.processing -= src
|
||||
return ..()
|
||||
|
||||
/datum/export/process()
|
||||
..()
|
||||
cost *= NUM_E**(k_elasticity * (1/30))
|
||||
if(cost > init_cost)
|
||||
cost = init_cost
|
||||
|
||||
// Checks the cost. 0 cost items are skipped in export.
|
||||
/datum/export/proc/get_cost(obj/O, allowed_categories = NONE, apply_elastic = TRUE)
|
||||
var/amount = get_amount(O)
|
||||
if(apply_elastic)
|
||||
if(k_elasticity!=0)
|
||||
return round((cost/k_elasticity) * (1 - NUM_E**(-1 * k_elasticity * amount))) //anti-derivative of the marginal cost function
|
||||
else
|
||||
return round(cost * amount) //alternative form derived from L'Hopital to avoid division by 0
|
||||
else
|
||||
return round(init_cost * amount)
|
||||
|
||||
// Checks the amount of exportable in object. Credits in the bill, sheets in the stack, etc.
|
||||
// Usually acts as a multiplier for a cost, so item that has 0 amount will be skipped in export.
|
||||
/datum/export/proc/get_amount(obj/O)
|
||||
return 1
|
||||
|
||||
// Checks if the item is fit for export datum.
|
||||
/datum/export/proc/applies_to(obj/O, allowed_categories = NONE, apply_elastic = TRUE)
|
||||
if((allowed_categories & export_category) != export_category)
|
||||
return FALSE
|
||||
if(!include_subtypes && !(O.type in export_types))
|
||||
return FALSE
|
||||
if(include_subtypes && (!is_type_in_typecache(O, export_types) || is_type_in_typecache(O, exclude_types)))
|
||||
return FALSE
|
||||
if(!get_cost(O, allowed_categories , apply_elastic))
|
||||
return FALSE
|
||||
if(O.flags_1 & HOLOGRAM_1)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
// Called only once, when the object is actually sold by the datum.
|
||||
// Adds item's cost and amount to the current export cycle.
|
||||
// get_cost, get_amount and applies_to do not neccesary mean a successful sale.
|
||||
/datum/export/proc/sell_object(obj/O, datum/export_report/report, dry_run = TRUE, allowed_categories = EXPORT_CARGO , apply_elastic = TRUE)
|
||||
var/the_cost = get_cost(O, allowed_categories , apply_elastic)
|
||||
var/amount = get_amount(O)
|
||||
|
||||
if(amount <=0 || the_cost <=0)
|
||||
return FALSE
|
||||
|
||||
report.total_value[src] += the_cost
|
||||
|
||||
if(istype(O, /datum/export/material))
|
||||
report.total_amount[src] += amount*MINERAL_MATERIAL_AMOUNT
|
||||
else
|
||||
report.total_amount[src] += amount
|
||||
|
||||
if(!dry_run)
|
||||
if(apply_elastic)
|
||||
cost *= NUM_E**(-1*k_elasticity*amount) //marginal cost modifier
|
||||
SSblackbox.record_feedback("nested tally", "export_sold_cost", 1, list("[O.type]", "[the_cost]"))
|
||||
return TRUE
|
||||
|
||||
// Total printout for the cargo console.
|
||||
// Called before the end of current export cycle.
|
||||
// It must always return something if the datum adds or removes any credts.
|
||||
/datum/export/proc/total_printout(datum/export_report/ex, notes = TRUE)
|
||||
if(!ex.total_amount[src] || !ex.total_value[src])
|
||||
return ""
|
||||
|
||||
var/total_value = ex.total_value[src]
|
||||
var/total_amount = ex.total_amount[src]
|
||||
|
||||
var/msg = "[total_value] credits: Received [total_amount] "
|
||||
if(total_value > 0)
|
||||
msg = "+" + msg
|
||||
|
||||
if(unit_name)
|
||||
msg += unit_name
|
||||
if(total_amount > 1)
|
||||
msg += "s"
|
||||
if(message)
|
||||
msg += " "
|
||||
|
||||
if(message)
|
||||
msg += message
|
||||
|
||||
msg += "."
|
||||
return msg
|
||||
|
||||
GLOBAL_LIST_EMPTY(exports_list)
|
||||
|
||||
/proc/setupExports()
|
||||
for(var/subtype in subtypesof(/datum/export))
|
||||
var/datum/export/E = new subtype
|
||||
if(E.export_types && E.export_types.len) // Exports without a type are invalid/base types
|
||||
GLOB.exports_list += E
|
||||
@@ -0,0 +1,801 @@
|
||||
/datum/export/gear
|
||||
include_subtypes = FALSE
|
||||
|
||||
//blanket
|
||||
/datum/export/gear/hat
|
||||
cost = 3
|
||||
unit_name = "clothing"
|
||||
export_types = list(/obj/item/clothing)
|
||||
include_subtypes = TRUE
|
||||
|
||||
//Hats
|
||||
|
||||
//Blanket
|
||||
/datum/export/gear/hat
|
||||
cost = 5
|
||||
unit_name = "hat"
|
||||
export_types = list(/obj/item/clothing/head)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/sec_helmet
|
||||
cost = 70
|
||||
unit_name = "helmet"
|
||||
export_types = list(/obj/item/clothing/head/helmet/sec)
|
||||
|
||||
/datum/export/gear/sec_soft
|
||||
cost = 50
|
||||
unit_name = "soft sec cap"
|
||||
export_types = list(/obj/item/clothing/head/soft/sec)
|
||||
|
||||
/datum/export/gear/sec_helmetalt
|
||||
cost = 50
|
||||
unit_name = "bullet proof helmet"
|
||||
export_types = list(/obj/item/clothing/head/helmet/alt)
|
||||
|
||||
/datum/export/gear/sec_helmetold
|
||||
cost = 10
|
||||
unit_name = "old helmet"
|
||||
export_types = list(/obj/item/clothing/head/helmet/old)
|
||||
|
||||
/datum/export/gear/sec_helmetblue
|
||||
cost = 75
|
||||
unit_name = "blue helmet"
|
||||
export_types = list(/obj/item/clothing/head/helmet/blueshirt)
|
||||
|
||||
/datum/export/gear/sec_helmetriot
|
||||
cost = 100
|
||||
unit_name = "riot helmet"
|
||||
export_types = list(/obj/item/clothing/head/helmet/riot)
|
||||
|
||||
/datum/export/gear/sec_helmet_light
|
||||
cost = 20
|
||||
unit_name = "justice helmet"
|
||||
export_types = list(/obj/item/clothing/head/helmet/justice/escape)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/syndicate_helmetswat
|
||||
cost = 250
|
||||
unit_name = "syndicate helmet"
|
||||
export_types = list(/obj/item/clothing/head/helmet/swat)
|
||||
|
||||
/datum/export/gear/sec_helmetswat
|
||||
cost = 150
|
||||
unit_name = "swat helmet"
|
||||
export_types = list(/obj/item/clothing/head/helmet/swat/nanotrasen)
|
||||
|
||||
/datum/export/gear/thunder_helmet
|
||||
cost = 120
|
||||
unit_name = "thunder dome helmet"
|
||||
export_types = list(/obj/item/clothing/head/helmet/thunderdome)
|
||||
|
||||
/datum/export/gear/roman_real
|
||||
cost = 30
|
||||
unit_name = "roman helmet"
|
||||
export_types = list(/obj/item/clothing/head/helmet/roman)
|
||||
|
||||
/datum/export/gear/roman_realalt
|
||||
cost = 60
|
||||
unit_name = "legionnaire helmet"
|
||||
export_types = list(/obj/item/clothing/head/helmet/roman/legionnaire)
|
||||
|
||||
/datum/export/gear/roman_fake
|
||||
cost = 10
|
||||
unit_name = "toy roman helmet"
|
||||
export_types = list(/obj/item/clothing/head/helmet/roman/fake)
|
||||
|
||||
/datum/export/gear/roman_fakealt
|
||||
cost = 20
|
||||
unit_name = "toy legionnaire helmet"
|
||||
export_types = list(/obj/item/clothing/head/helmet/roman/legionnaire/fake)
|
||||
|
||||
/datum/export/gear/ash_walker_helm
|
||||
cost = 70
|
||||
unit_name = "gladiator helmet"
|
||||
export_types = list(/obj/item/clothing/head/helmet/gladiator)
|
||||
|
||||
/datum/export/gear/lasertag
|
||||
cost = 30 //Has armor
|
||||
unit_name = "lasertag helmet"
|
||||
export_types = list(/obj/item/clothing/head/helmet/redtaghelm)
|
||||
|
||||
/datum/export/gear/lasertag/blue
|
||||
export_types = list(/obj/item/clothing/head/helmet/bluetaghelm)
|
||||
|
||||
/datum/export/gear/knight_helmet
|
||||
cost = 200
|
||||
k_elasticity = 1/5 //Rare, dont flood it
|
||||
unit_name = "knight helmet"
|
||||
export_types = list(/obj/item/clothing/head/helmet/knight, /obj/item/clothing/head/helmet/knight/blue, /obj/item/clothing/head/helmet/knight/yellow, /obj/item/clothing/head/helmet/knight/red)
|
||||
|
||||
/datum/export/gear/skull_hat
|
||||
cost = 70
|
||||
k_elasticity = 1/15 //Its just a skull
|
||||
unit_name = "skull"
|
||||
export_types = list(/obj/item/clothing/head/helmet/skull)
|
||||
|
||||
/datum/export/gear/durathread_helm
|
||||
cost = 100
|
||||
k_elasticity = 1/15
|
||||
unit_name = "durathread hat"
|
||||
export_types = list(/obj/item/clothing/head/helmet/durathread, /obj/item/clothing/head/beret/durathread, /obj/item/clothing/head/beanie/durathread)
|
||||
|
||||
/datum/export/gear/hard_hats
|
||||
cost = 50
|
||||
unit_name = "hard hat"
|
||||
export_types = list(/obj/item/clothing/head/hardhat, /obj/item/clothing/head/hardhat/orange, /obj/item/clothing/head/hardhat/white, /obj/item/clothing/head/hardhat/dblue)
|
||||
|
||||
/datum/export/gear/atmos_helm
|
||||
cost = 200 //Armored, fire proof, light, and presser proof
|
||||
unit_name = "atmos hard hat"
|
||||
export_types = list(/obj/item/clothing/head/hardhat/atmos)
|
||||
|
||||
/datum/export/gear/crowns
|
||||
cost = 350 //Armored, gold 300cr of gold to make so give them 50 more for working
|
||||
k_elasticity = 1/5 //Anti-floods
|
||||
unit_name = "crown"
|
||||
export_types = list(/obj/item/clothing/head/crown, /obj/item/clothing/head/crown/fancy)
|
||||
|
||||
/datum/export/gear/cchat
|
||||
cost = 40
|
||||
unit_name = "centcom hat"
|
||||
export_types = list(/obj/item/clothing/head/centhat)
|
||||
|
||||
/datum/export/gear/caphat
|
||||
cost = 150
|
||||
unit_name = "command hat"
|
||||
export_types = list(/obj/item/clothing/head/caphat, /obj/item/clothing/head/caphat/parade, /obj/item/clothing/head/caphat/beret)
|
||||
|
||||
/datum/export/gear/hophat
|
||||
cost = 130
|
||||
unit_name = "hop hat"
|
||||
export_types = list(/obj/item/clothing/head/hopcap, /obj/item/clothing/head/hopcap/beret)
|
||||
|
||||
/datum/export/gear/dechat
|
||||
cost = 75
|
||||
k_elasticity = 1/8 //Anti-floods
|
||||
unit_name = "fedora"
|
||||
export_types = list(/obj/item/clothing/head/fedora/det_hat, /obj/item/clothing/head/fedora/curator, /obj/item/clothing/head/fedora)
|
||||
|
||||
/datum/export/gear/hoshat
|
||||
cost = 140
|
||||
unit_name = "hos hat"
|
||||
export_types = list(/obj/item/clothing/head/HoS, /obj/item/clothing/head/HoS/beret, /obj/item/clothing/head/beret/sec/navyhos)
|
||||
|
||||
/datum/export/gear/syndahoshat
|
||||
cost = 300
|
||||
unit_name = "syndicate command hat"
|
||||
export_types = list(/obj/item/clothing/head/HoS/syndicate, /obj/item/clothing/head/HoS/beret/syndicate)
|
||||
|
||||
/datum/export/gear/wardenhat
|
||||
cost = 90
|
||||
unit_name = "warden hat"
|
||||
export_types = list(/obj/item/clothing/head/warden, /obj/item/clothing/head/warden/drill, /obj/item/clothing/head/beret/sec/navywarden)
|
||||
|
||||
/datum/export/gear/sechats
|
||||
cost = 60
|
||||
unit_name = "sec beret"
|
||||
export_types = list(/obj/item/clothing/head/beret/sec, /obj/item/clothing/head/beret/sec/navyofficer)
|
||||
|
||||
/datum/export/gear/berets
|
||||
cost = 30
|
||||
unit_name = "beret"
|
||||
export_types = list(/obj/item/clothing/head/beret/qm, /obj/item/clothing/head/beret/rd, /obj/item/clothing/head/beret/cmo, /obj/item/clothing/head/beret)
|
||||
|
||||
/datum/export/gear/berets
|
||||
cost = 30
|
||||
unit_name = "beret"
|
||||
export_types = list(/obj/item/clothing/head/beret/qm, /obj/item/clothing/head/beret/rd, /obj/item/clothing/head/beret/cmo, /obj/item/clothing/head/beret)
|
||||
|
||||
/datum/export/gear/collectable
|
||||
cost = 500
|
||||
unit_name = "collectable hat"
|
||||
k_elasticity = 1/10 //dont flood these
|
||||
export_types = list(/obj/item/clothing/head/collectable)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/fancyhats
|
||||
cost = 75
|
||||
unit_name = "fancy hat"
|
||||
k_elasticity = 1/10 //dont flood these
|
||||
export_types = list(/obj/item/clothing/head/that, /obj/item/clothing/head/bowler, /obj/item/clothing/head/lizard, /obj/item/clothing/head/canada)
|
||||
|
||||
/datum/export/gear/welders
|
||||
cost = 30
|
||||
unit_name = "welder helm"
|
||||
k_elasticity = 1/20 //dont flood these
|
||||
export_types = list(/obj/item/clothing/head/welding)
|
||||
|
||||
/datum/export/gear/magichat //Magic as is Antags-Wiz/Cults
|
||||
cost = 450
|
||||
unit_name = "magic hat"
|
||||
export_types = list(/obj/item/clothing/head/wizard, /obj/item/clothing/head/culthood, /obj/item/clothing/head/magus, /obj/item/clothing/head/helmet/clockwork)
|
||||
exclude_types = list(/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard/marisa/fake)
|
||||
include_subtypes = TRUE
|
||||
|
||||
//Shoes
|
||||
|
||||
//Blanket
|
||||
/datum/export/gear/shoes
|
||||
cost = 1 //Really dont want to sell EVERY SHOE EVER - yet*
|
||||
unit_name = "shoes"
|
||||
export_types = list(/obj/item/clothing/shoes)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/clown_shoesmk
|
||||
cost = 600
|
||||
unit_name = "mk-honk prototype shoes"
|
||||
export_types = list(/obj/item/clothing/shoes/clown_shoes/banana_shoes)
|
||||
|
||||
/datum/export/gear/magboots
|
||||
cost = 50
|
||||
unit_name = "magboots"
|
||||
export_types = list(/obj/item/clothing/shoes/magboots, /obj/item/clothing/shoes/magboots/atmos)
|
||||
|
||||
/datum/export/gear/nosellboots
|
||||
cost = -5000 //We DONT want scew antags
|
||||
unit_name = "error shipment stolen"
|
||||
export_types = list(/obj/item/clothing/shoes/magboots/advance, /obj/item/clothing/shoes/magboots/deathsquad)
|
||||
|
||||
/datum/export/gear/syndamagboots
|
||||
cost = 250
|
||||
unit_name = "blood redmagboots"
|
||||
export_types = list(/obj/item/clothing/shoes/magboots/syndie)
|
||||
|
||||
/datum/export/gear/combatboots
|
||||
cost = 30
|
||||
unit_name = "combat boots"
|
||||
export_types = list(/obj/item/clothing/shoes/combat)
|
||||
|
||||
/datum/export/gear/swatboots
|
||||
cost = 45
|
||||
unit_name = "swat boots"
|
||||
export_types = list(/obj/item/clothing/shoes/combat/swat)
|
||||
|
||||
/datum/export/gear/galoshes
|
||||
cost = 50
|
||||
unit_name = "galoshes"
|
||||
export_types = list(/obj/item/clothing/shoes/galoshes, /obj/item/clothing/shoes/galoshes/dry)
|
||||
|
||||
/datum/export/gear/clown
|
||||
cost = 10
|
||||
unit_name = "clown shoes"
|
||||
export_types = list(/obj/item/clothing/shoes/clown_shoes, /obj/item/clothing/shoes/clown_shoes/jester)
|
||||
|
||||
/datum/export/gear/dressshoes
|
||||
cost = 10
|
||||
unit_name = "dress shoes"
|
||||
export_types = list(/obj/item/clothing/shoes/laceup, /obj/item/clothing/shoes/singerb, /obj/item/clothing/shoes/singery)
|
||||
|
||||
/datum/export/gear/working
|
||||
cost = 15
|
||||
unit_name = "boots"
|
||||
export_types = list(/obj/item/clothing/shoes/jackboots/fast, /obj/item/clothing/shoes/winterboots, /obj/item/clothing/shoes/jackboots, /obj/item/clothing/shoes/workboots, /obj/item/clothing/shoes/workboots/mining)
|
||||
|
||||
/datum/export/gear/hopboots
|
||||
cost = 350 //costs 1000 credits for miners to get
|
||||
unit_name = "jump boots"
|
||||
export_types = list(/obj/item/clothing/shoes/bhop)
|
||||
|
||||
/datum/export/gear/magicboots //Magic as in Antag - Wiz/Cults
|
||||
cost = 450
|
||||
unit_name = "magic shoes"
|
||||
export_types = list(/obj/item/clothing/shoes/sandal/marisa, /obj/item/clothing/shoes/sandal/magic, /obj/item/clothing/shoes/cult, /obj/item/clothing/shoes/clockwork, /obj/item/clothing/shoes/clown_shoes/taeclowndo, /obj/item/clothing/shoes/sandal/slippers)
|
||||
include_subtypes = TRUE
|
||||
|
||||
//Headsets/Ears
|
||||
|
||||
//Blanket
|
||||
/datum/export/gear/ears
|
||||
cost = 2 //We dont want to sell every headset ever
|
||||
unit_name = "ear gear"
|
||||
export_types = list(/obj/item/clothing/ears, /obj/item/radio/headset)
|
||||
include_subtypes = TRUE
|
||||
|
||||
//Gloves
|
||||
|
||||
//Blanket
|
||||
/datum/export/gear/gloves
|
||||
cost = 4 //Glove crafting can be done
|
||||
unit_name = "gloves"
|
||||
export_types = list(/obj/item/clothing/gloves)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/boxing
|
||||
cost = 10 //Padding as well as a weapon
|
||||
unit_name = "boxing gloves"
|
||||
export_types = list(/obj/item/clothing/gloves/boxing)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/combatgloves
|
||||
cost = 80
|
||||
unit_name = "combat gloves"
|
||||
export_types = list(/obj/item/clothing/gloves/combat, /obj/item/clothing/gloves/rapid, /obj/item/clothing/gloves/krav_maga)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/bonegloves
|
||||
cost = 30
|
||||
unit_name = "bone bracers"
|
||||
export_types = list(/obj/item/clothing/gloves/bracer)
|
||||
|
||||
/datum/export/gear/yellowgloves
|
||||
cost = 50
|
||||
unit_name = "insulated gloves"
|
||||
export_types = list(/obj/item/clothing/gloves/color/yellow, /obj/item/clothing/gloves/color/red/insulated)
|
||||
|
||||
/datum/export/gear/leathergloves
|
||||
cost = 20
|
||||
unit_name = "leather gloves"
|
||||
export_types = list(/obj/item/clothing/gloves/botanic_leather)
|
||||
|
||||
/datum/export/gear/fancy
|
||||
cost = 25
|
||||
unit_name = "fancy gloves"
|
||||
export_types = list(/obj/item/clothing/gloves/color/black, /obj/item/clothing/gloves/color/captain, /obj/item/clothing/gloves/color/white)
|
||||
|
||||
/datum/export/gear/magicgloves//Magic as in Antag - Wiz/Cults
|
||||
cost = 400
|
||||
unit_name = "magic gloves"
|
||||
export_types = list(/obj/item/clothing/gloves/clockwork)
|
||||
include_subtypes = TRUE
|
||||
|
||||
//Ties/neck
|
||||
|
||||
//Blanket
|
||||
/datum/export/gear/neck
|
||||
cost = 5 //Fancy!
|
||||
unit_name = "neck based gear"
|
||||
export_types = list(/obj/item/clothing/neck)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/collar
|
||||
cost = 7
|
||||
unit_name = "collar"
|
||||
export_types = list(/obj/item/clothing/neck/petcollar)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/bling
|
||||
cost = 15 //Needs a coin
|
||||
unit_name = "gold plated necklace"
|
||||
export_types = list(/obj/item/clothing/neck/necklace/dope)
|
||||
|
||||
//masks
|
||||
|
||||
//Blanket
|
||||
/datum/export/gear/masks
|
||||
cost = 3 //Mostly just fake stuff and clowngear
|
||||
unit_name = "face gear"
|
||||
export_types = list(/obj/item/clothing/mask)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/gasmask
|
||||
cost = 4
|
||||
unit_name = "gas mask"
|
||||
export_types = list(/obj/item/clothing/mask/gas, /obj/item/clothing/mask/gas/glass)
|
||||
|
||||
/datum/export/gear/minermask
|
||||
cost = 10
|
||||
unit_name = "armored mask"
|
||||
export_types = list(/obj/item/clothing/mask/gas/welding, /obj/item/clothing/mask/gas/explorer, /obj/item/clothing/mask/gas/syndicate)
|
||||
|
||||
/datum/export/gear/sechailer
|
||||
cost = 6
|
||||
unit_name = "sec hailer"
|
||||
export_types = list(/obj/item/clothing/mask/gas/sechailer)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/mask/breath
|
||||
cost = 2
|
||||
unit_name = "breath mask"
|
||||
export_types = list(/obj/item/clothing/mask/breath)
|
||||
|
||||
//Hardsuits //If you steal/fine more they are worth selling
|
||||
|
||||
//Blanket
|
||||
/datum/export/gear/hardsuit
|
||||
cost = 250 //Its just metal/plastic after all
|
||||
unit_name = "unknown hardsuit"
|
||||
export_types = list(/obj/item/clothing/suit/space/hardsuit)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/engi_hardsuit
|
||||
cost = 500
|
||||
unit_name = "engine hardsuit"
|
||||
export_types = list(/obj/item/clothing/suit/space/hardsuit/engine)
|
||||
|
||||
/datum/export/gear/atmos_hardsuit
|
||||
cost = 600
|
||||
unit_name = "atmos hardsuit"
|
||||
export_types = list(/obj/item/clothing/suit/space/hardsuit/engine/atmos)
|
||||
|
||||
/datum/export/gear/engi_hardsuit
|
||||
cost = 1000
|
||||
unit_name = "elite engine hardsuit"
|
||||
export_types = list(/obj/item/clothing/suit/space/hardsuit/engine/elite)
|
||||
|
||||
/datum/export/gear/mining_hardsuit
|
||||
cost = 350 //common
|
||||
unit_name = "mining hardsuit"
|
||||
export_types = list(/obj/item/clothing/suit/space/hardsuit/mining)
|
||||
|
||||
/datum/export/gear/sec_hardsuit
|
||||
cost = 750
|
||||
unit_name = "sec hardsuit"
|
||||
export_types = list(/obj/item/clothing/head/helmet/space/hardsuit/mining, /obj/item/clothing/head/helmet/space/hardsuit/syndi/owl)
|
||||
|
||||
/datum/export/gear/syndi_hardsuit
|
||||
cost = 1250
|
||||
unit_name = "syndi hardsuit"
|
||||
export_types = list(/obj/item/clothing/suit/space/hardsuit/syndi)
|
||||
|
||||
/datum/export/gear/syndi_hardsuit
|
||||
cost = 2750
|
||||
unit_name = "elite syndi hardsuit"
|
||||
export_types = list(/obj/item/clothing/suit/space/hardsuit/syndi/elite)
|
||||
|
||||
/datum/export/gear/medical_hardsuit
|
||||
cost = 350 //Not all that good
|
||||
unit_name = "meidcal hardsuit"
|
||||
export_types = list(/obj/item/clothing/suit/space/hardsuit/medical)
|
||||
|
||||
/datum/export/gear/rd_hardsuit
|
||||
cost = 850 //rare
|
||||
unit_name = "prototype hardsuit"
|
||||
export_types = list(/obj/item/clothing/suit/space/hardsuit/rd)
|
||||
|
||||
/datum/export/gear/sec_hardsuit
|
||||
cost = 750
|
||||
unit_name = "sec hardsuit"
|
||||
export_types = list(/obj/item/clothing/suit/space/hardsuit/security)
|
||||
|
||||
/datum/export/gear/command_hardsuit
|
||||
cost = 1300
|
||||
unit_name = "command hardsuit"
|
||||
export_types = list(/obj/item/clothing/suit/space/hardsuit/security/hos, /obj/item/clothing/suit/space/hardsuit/captain)
|
||||
|
||||
/datum/export/gear/magic_hardsuit
|
||||
cost = 3000
|
||||
unit_name = "magic hardsuit"
|
||||
export_types = list(/obj/item/clothing/suit/space/hardsuit/wizard, /obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/item/clothing/suit/space/hardsuit/cult)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/shield_hardsuit
|
||||
cost = 2000
|
||||
unit_name = "shielded hardsuit"
|
||||
export_types = list(/obj/item/clothing/suit/space/hardsuit/shielded)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/rigs
|
||||
cost = 2750
|
||||
unit_name = "RIG"
|
||||
export_types = list(/obj/item/clothing/suit/space/hardsuit/ancient, /obj/item/clothing/suit/space/hardsuit/ancient/mason)
|
||||
|
||||
//Soft Suits
|
||||
|
||||
//Blanket
|
||||
datum/export/gear/space/helmet
|
||||
cost = 55
|
||||
unit_name = "space helmet"
|
||||
export_types = list(/obj/item/clothing/head/helmet/space)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/space/suit
|
||||
cost = 60
|
||||
unit_name = "space suit"
|
||||
export_types = list(/obj/item/clothing/suit/space)
|
||||
include_subtypes = TRUE
|
||||
|
||||
datum/export/gear/space/helmet/plasma
|
||||
cost = 100
|
||||
unit_name = "plasmaman space helmet"
|
||||
export_types = list(/obj/item/clothing/suit/space/eva/plasmaman)
|
||||
|
||||
/datum/export/gear/space/suit/plasma
|
||||
cost = 100
|
||||
unit_name = "plasmaman space suit"
|
||||
export_types = list(/obj/item/clothing/suit/space/eva/plasmaman)
|
||||
|
||||
datum/export/gear/space/helmet/synda
|
||||
cost = 150 //Flash proof
|
||||
unit_name = "syndicate space helmet"
|
||||
export_types = list(/obj/item/clothing/head/helmet/space/syndicate)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/space/suit/synda
|
||||
cost = 150
|
||||
unit_name = "syndicate space suit"
|
||||
export_types = list(/obj/item/clothing/head/helmet/space/syndicate)
|
||||
include_subtypes = TRUE
|
||||
|
||||
//Glasses
|
||||
|
||||
//Blanket
|
||||
datum/export/gear/glasses //glasses are not worth selling
|
||||
cost = 3
|
||||
unit_name = "glasses"
|
||||
export_types = list(/obj/item/clothing/glasses)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/mesons
|
||||
cost = 6
|
||||
unit_name = "mesons"
|
||||
export_types = list(/obj/item/clothing/glasses/meson, /obj/item/clothing/glasses/material/mining)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/scigoggles
|
||||
cost = 8
|
||||
unit_name = "chem giggles"
|
||||
export_types = list(/obj/item/clothing/glasses/science)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/nvgoggles
|
||||
cost = 20
|
||||
unit_name = "night vison giggles"
|
||||
export_types = list(/obj/item/clothing/glasses/night)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/sunglasses
|
||||
cost = 12
|
||||
unit_name = "sunglasses"
|
||||
export_types = list(/obj/item/clothing/glasses/sunglasses)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/huds
|
||||
cost = 10
|
||||
unit_name = "huds"
|
||||
export_types = list(/obj/item/clothing/glasses/hud)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/huds/glasses
|
||||
cost = 22
|
||||
export_types = list(/obj/item/clothing/glasses/hud/health/sunglasses, /obj/item/clothing/glasses/hud/security/sunglasses)
|
||||
|
||||
/datum/export/gear/weldinggoggles
|
||||
cost = 20
|
||||
unit_name = "welding goggles"
|
||||
export_types = list(/obj/item/clothing/glasses/welding)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/thermals
|
||||
cost = 30
|
||||
unit_name = "heat seeing goggles"
|
||||
export_types = list(/obj/item/clothing/glasses/thermal, /obj/item/clothing/glasses/hud/toggle/thermal)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/magic_glasses
|
||||
cost = 140
|
||||
unit_name = "magic goggles"
|
||||
export_types = list(/obj/item/clothing/glasses/godeye, /obj/item/clothing/glasses/hud/health/night/cultblind, /obj/item/clothing/glasses/wraith_spectacles, /obj/item/clothing/glasses/judicial_visor)
|
||||
include_subtypes = TRUE
|
||||
|
||||
//////////
|
||||
//UNDER///
|
||||
//////////
|
||||
|
||||
/datum/export/gear/jumpsuit
|
||||
cost = 3
|
||||
unit_name = "jumpsuit"
|
||||
k_elasticity = 1/100 //you can craft white jumpsuits, if someone does that 300 times, they deserve the 800 credits
|
||||
export_types = list(/obj/item/clothing/under)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/fancy_jumpsuit
|
||||
cost = 10
|
||||
unit_name = "fancy clothing"
|
||||
k_elasticity = 1/90 //These will be what sells
|
||||
export_types = list(/obj/item/clothing/under/scratch, /obj/item/clothing/under/sl_suit, /obj/item/clothing/under/rank/vice, /obj/item/clothing/under/suit_jacket, \
|
||||
/obj/item/clothing/under/burial, /obj/item/clothing/under/skirt/black, /obj/item/clothing/under/captainparade, /obj/item/clothing/under/hosparademale, \
|
||||
/obj/item/clothing/under/hosparadefem, /obj/item/clothing/under/assistantformal, /obj/item/clothing/under/stripeddress, /obj/item/clothing/under/redeveninggown, \
|
||||
/obj/item/clothing/under/plaid_skirt, /obj/item/clothing/under/geisha, /obj/item/clothing/under/trek, /obj/item/clothing/under/wedding, /obj/item/clothing/under/aviatoruniform,\
|
||||
/obj/item/clothing/under/mega, /obj/item/clothing/under/cia, /obj/item/clothing/under/casualwear, /obj/item/clothing/under/rank)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/armored_jumpsuit
|
||||
cost = 15
|
||||
unit_name = "armored_jumpsuit"
|
||||
k_elasticity = 1/90 //These will be what sells
|
||||
export_types = list(/obj/item/clothing/under/durathread, /obj/item/clothing/under/rank/security, /obj/item/clothing/under/plasmaman, /obj/item/clothing/under/syndicate, \
|
||||
/obj/item/clothing/under/rank/det, /obj/item/clothing/under/rank/head_of_security, /obj/item/clothing/under/rank/security/spacepol)
|
||||
exclude_types = list(/obj/item/clothing/under/syndicate/tacticool, /obj/item/clothing/under/syndicate/tacticool/skirt)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/jumpsuit_addon
|
||||
cost = 12 //Few and rare as well as quick drop off of vaule
|
||||
unit_name = "jumpsuit add on"
|
||||
k_elasticity = 1/10
|
||||
export_types = list(/obj/item/clothing/accessory)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/robes_magic
|
||||
cost = 120
|
||||
unit_name = "magic robes"
|
||||
export_types = list(/obj/item/clothing/suit/wizrobe, /obj/item/clothing/suit/cultrobes, /obj/item/clothing/suit/magusred, /obj/item/clothing/suit/hooded/cultrobes)
|
||||
exclude_types = list(/obj/item/clothing/suit/wizrobe/fake)
|
||||
include_subtypes = TRUE
|
||||
|
||||
//Amror
|
||||
/datum/export/gear/armor
|
||||
cost = 80
|
||||
unit_name = "misc armor"
|
||||
export_types = list(/obj/item/clothing/suit/armor)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/sec_armor
|
||||
cost = 180
|
||||
unit_name = "sec armor"
|
||||
export_types = list(/obj/item/clothing/suit/armor/vest/leather, /obj/item/clothing/suit/armor/bulletproof, /obj/item/clothing/suit/armor/vest/det_suit)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/hosarmor
|
||||
cost = 380
|
||||
unit_name = "hos armor"
|
||||
export_types = list(/obj/item/clothing/suit/armor/hos)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/wardenarmor
|
||||
cost = 280
|
||||
unit_name = "warden armor"
|
||||
export_types = list(/obj/item/clothing/suit/armor/vest/warden)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/reflector
|
||||
cost = 500
|
||||
unit_name = "reflector armor"
|
||||
export_types = list(/obj/item/clothing/suit/armor/laserproof)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/heavy_armor
|
||||
cost = 600 //REALY hard to fine/make takes lots of slimes
|
||||
unit_name = "heavy armor"
|
||||
export_types = list(/obj/item/clothing/suit/armor/heavy)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/plate_armor
|
||||
cost = 200
|
||||
unit_name = "plate armor"
|
||||
export_types = list(/obj/item/clothing/suit/armor/riot/knight)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/riot_armor
|
||||
cost = 250
|
||||
unit_name = "riot armor"
|
||||
export_types = list(/obj/item/clothing/suit/armor/riot)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/bone_armor
|
||||
cost = 50
|
||||
unit_name = "bone armor"
|
||||
export_types = list(/obj/item/clothing/suit/armor/bone)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/swat_armor
|
||||
cost = 350
|
||||
unit_name = "swat mki armor"
|
||||
export_types = list(/obj/item/clothing/suit/space/swat)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/dragon_armor
|
||||
cost = 750
|
||||
unit_name = "drake bone armor"
|
||||
export_types = list(/obj/item/clothing/suit/hooded/cloak/drake)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/commandamor
|
||||
cost = 480
|
||||
unit_name = "command armor"
|
||||
export_types = list(/obj/item/clothing/suit/armor/vest/capcarapace, /obj/item/clothing/suit/armor/centcom)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/reactive_base
|
||||
cost = 600
|
||||
k_elasticity = 1/2 //Lets not go over board
|
||||
unit_name = "hollow reactive armor"
|
||||
export_types = list(/obj/item/reactive_armour_shell, /obj/item/clothing/suit/armor/reactive)
|
||||
|
||||
/datum/export/gear/reactive_active
|
||||
cost = 1200
|
||||
k_elasticity = 1/3 //Lets not go over board
|
||||
unit_name = "working reactive armor"
|
||||
export_types = list(/obj/item/clothing/suit/armor/reactive/repulse, /obj/item/clothing/suit/armor/reactive/tesla, /obj/item/clothing/suit/armor/reactive/teleport)
|
||||
|
||||
///////////////////////////
|
||||
//Bomb/Rad/Bio Suits/Fire//
|
||||
///////////////////////////
|
||||
|
||||
/datum/export/gear/radhelmet
|
||||
cost = 20
|
||||
unit_name = "radsuit hood"
|
||||
export_types = list(/obj/item/clothing/head/radiation)
|
||||
|
||||
/datum/export/gear/radsuit
|
||||
cost = 40
|
||||
unit_name = "radsuit"
|
||||
export_types = list(/obj/item/clothing/suit/radiation)
|
||||
|
||||
/datum/export/gear/firehelmet
|
||||
cost = 10
|
||||
unit_name = "firesuit helmet"
|
||||
export_types = list(/obj/item/clothing/head/hardhat/red)
|
||||
|
||||
/datum/export/gear/fireatmos
|
||||
cost = 120
|
||||
unit_name = "atmos firesuit"
|
||||
export_types = list(/obj/item/clothing/suit/fire/atmos)
|
||||
|
||||
/datum/export/gear/firesuit
|
||||
cost = 20
|
||||
unit_name = "firesuit"
|
||||
export_types = list(/obj/item/clothing/suit/fire, /obj/item/clothing/suit/fire/firefighter, /obj/item/clothing/suit/fire/heavy)
|
||||
|
||||
/datum/export/gear/biohood
|
||||
cost = 40
|
||||
unit_name = "biosuit hood"
|
||||
export_types = list(/obj/item/clothing/head/bio_hood)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/biosuit
|
||||
cost = 60
|
||||
unit_name = "biosuit"
|
||||
export_types = list(/obj/item/clothing/suit/bio_suit)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/bombhelmet
|
||||
cost = 40
|
||||
unit_name = "bomb suit hood"
|
||||
export_types = list(/obj/item/clothing/head/bomb_hood)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/bombsuit
|
||||
cost = 60
|
||||
unit_name = "bomb suit"
|
||||
export_types = list(/obj/item/clothing/suit/bomb_suit)
|
||||
include_subtypes = TRUE
|
||||
|
||||
////////////////////
|
||||
//Cloaks and Coats//
|
||||
////////////////////
|
||||
|
||||
/datum/export/gear/cloaks
|
||||
cost = 30
|
||||
unit_name = "cloak"
|
||||
export_types = list(/obj/item/clothing/neck/cloak)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/cloaksmining
|
||||
cost = 90
|
||||
unit_name = "lava land cloak"
|
||||
export_types = list(/obj/item/clothing/suit/hooded/cloak/goliath)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/labcoats
|
||||
cost = 15
|
||||
unit_name = "labcoats"
|
||||
export_types = list(/obj/item/clothing/suit/toggle/labcoat)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/wintercoats
|
||||
cost = 25
|
||||
unit_name = "wintercoats"
|
||||
export_types = list(/obj/item/clothing/suit/hooded/wintercoat)
|
||||
include_subtypes = TRUE
|
||||
|
||||
//////////
|
||||
//SUITS///
|
||||
//////////
|
||||
|
||||
/datum/export/gear/suits
|
||||
cost = 40
|
||||
unit_name = "suit"
|
||||
export_types = list(/obj/item/clothing/suit)
|
||||
include_subtypes = TRUE
|
||||
|
||||
//////////////////////
|
||||
//Chameleon Gear//////
|
||||
//////////////////////
|
||||
/datum/export/gear/chameleon //Selling a full kit is easy money for 2 tc
|
||||
cost = 280
|
||||
k_elasticity = 0
|
||||
unit_name = "chameleon item"
|
||||
export_types = list(/obj/item/clothing/head/chameleon, /obj/item/clothing/mask/chameleon, /obj/item/clothing/under/chameleon, /obj/item/clothing/suit/chameleon, /obj/item/clothing/glasses/chameleon,\
|
||||
/obj/item/clothing/gloves/chameleon, /obj/item/clothing/head/chameleon, /obj/item/clothing/shoes/chameleon, /obj/item/storage/backpack/chameleon, \
|
||||
/obj/item/storage/belt/chameleon, /obj/item/radio/headset/chameleon, /obj/item/pda/chameleon, /obj/item/stamp/chameleon, /obj/item/clothing/neck/cloak/chameleon)
|
||||
include_subtypes = TRUE
|
||||
@@ -0,0 +1,357 @@
|
||||
/datum/export/large
|
||||
k_elasticity = 0
|
||||
|
||||
/datum/export/large/crate
|
||||
cost = 500
|
||||
k_elasticity = 0
|
||||
unit_name = "crate"
|
||||
export_types = list(/obj/structure/closet/crate)
|
||||
exclude_types = list(/obj/structure/closet/crate/large, /obj/structure/closet/crate/wooden)
|
||||
|
||||
/datum/export/large/crate/total_printout(datum/export_report/ex, notes = TRUE) // That's why a goddamn metal crate costs that much.
|
||||
. = ..()
|
||||
if(. && notes)
|
||||
. += " Thanks for participating in Nanotrasen Crates Recycling Program."
|
||||
|
||||
/datum/export/large/crate/wooden
|
||||
cost = 100
|
||||
unit_name = "large wooden crate"
|
||||
export_types = list(/obj/structure/closet/crate/large)
|
||||
exclude_types = list()
|
||||
|
||||
/datum/export/large/crate/wooden/ore
|
||||
unit_name = "ore box"
|
||||
export_types = list(/obj/structure/ore_box)
|
||||
|
||||
/datum/export/large/crate/wood
|
||||
cost = 140 //
|
||||
unit_name = "wooden crate"
|
||||
export_types = list(/obj/structure/closet/crate/wooden)
|
||||
exclude_types = list()
|
||||
|
||||
/datum/export/large/barrel
|
||||
cost = 500 //150 to make meaning proffit of 350
|
||||
unit_name = "wooden barrel"
|
||||
export_types = list(/obj/structure/fermenting_barrel)
|
||||
|
||||
/datum/export/large/crate/coffin
|
||||
cost = 150
|
||||
unit_name = "coffin"
|
||||
export_types = list(/obj/structure/closet/crate/coffin)
|
||||
|
||||
/datum/export/large/reagent_dispenser
|
||||
cost = 100 // +0-400 depending on amount of reagents left
|
||||
var/contents_cost = 400
|
||||
|
||||
/datum/export/large/reagent_dispenser/get_cost(obj/O)
|
||||
var/obj/structure/reagent_dispensers/D = O
|
||||
var/ratio = D.reagents.total_volume / D.reagents.maximum_volume
|
||||
|
||||
return ..() + round(contents_cost * ratio)
|
||||
|
||||
/datum/export/large/reagent_dispenser/water
|
||||
unit_name = "watertank"
|
||||
export_types = list(/obj/structure/reagent_dispensers/watertank)
|
||||
contents_cost = 200
|
||||
|
||||
/datum/export/large/reagent_dispenser/fuel
|
||||
unit_name = "fueltank"
|
||||
export_types = list(/obj/structure/reagent_dispensers/fueltank)
|
||||
|
||||
/datum/export/large/reagent_dispenser/beer
|
||||
unit_name = "beer keg"
|
||||
contents_cost = 700
|
||||
export_types = list(/obj/structure/reagent_dispensers/beerkeg)
|
||||
|
||||
/datum/export/large/pipedispenser
|
||||
cost = 500
|
||||
unit_name = "pipe dispenser"
|
||||
export_types = list(/obj/machinery/pipedispenser)
|
||||
|
||||
/datum/export/large/emitter
|
||||
cost = 550
|
||||
unit_name = "emitter"
|
||||
export_types = list(/obj/machinery/power/emitter)
|
||||
|
||||
/datum/export/large/field_generator
|
||||
cost = 550
|
||||
unit_name = "field generator"
|
||||
export_types = list(/obj/machinery/field/generator)
|
||||
|
||||
/datum/export/large/collector
|
||||
cost = 400
|
||||
unit_name = "radiation collector"
|
||||
export_types = list(/obj/machinery/power/rad_collector)
|
||||
|
||||
/datum/export/large/tesla_coil
|
||||
cost = 450
|
||||
unit_name = "tesla coil"
|
||||
export_types = list(/obj/machinery/power/tesla_coil)
|
||||
|
||||
/datum/export/large/pa
|
||||
cost = 350
|
||||
unit_name = "particle accelerator part"
|
||||
export_types = list(/obj/structure/particle_accelerator)
|
||||
|
||||
/datum/export/large/pa/controls
|
||||
cost = 500
|
||||
unit_name = "particle accelerator control console"
|
||||
export_types = list(/obj/machinery/particle_accelerator/control_box)
|
||||
|
||||
/datum/export/large/supermatter
|
||||
cost = 8000
|
||||
unit_name = "supermatter shard"
|
||||
export_types = list(/obj/machinery/power/supermatter_crystal/shard)
|
||||
|
||||
/datum/export/large/grounding_rod
|
||||
cost = 350
|
||||
unit_name = "grounding rod"
|
||||
export_types = list(/obj/machinery/power/grounding_rod)
|
||||
|
||||
/datum/export/large/tesla_gen
|
||||
cost = 4000
|
||||
unit_name = "energy ball generator"
|
||||
export_types = list(/obj/machinery/the_singularitygen/tesla)
|
||||
|
||||
/datum/export/large/singulo_gen
|
||||
cost = 4000
|
||||
unit_name = "gravitational singularity generator"
|
||||
export_types = list(/obj/machinery/the_singularitygen)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/large/am_control_unit
|
||||
cost = 4000
|
||||
unit_name = "antimatter control unit"
|
||||
export_types = list(/obj/machinery/power/am_control_unit)
|
||||
|
||||
/datum/export/large/am_shielding_container
|
||||
cost = 150
|
||||
unit_name = "packaged antimatter reactor section"
|
||||
export_types = list(/obj/item/am_shielding_container)
|
||||
|
||||
/datum/export/large/iv
|
||||
cost = 50
|
||||
unit_name = "iv drip"
|
||||
export_types = list(/obj/machinery/iv_drip)
|
||||
|
||||
/datum/export/large/barrier
|
||||
cost = 25
|
||||
unit_name = "security barrier"
|
||||
export_types = list(/obj/item/grenade/barrier, /obj/structure/barricade/security)
|
||||
|
||||
/datum/export/large/frame
|
||||
cost = 20
|
||||
unit_name = "structure frame"
|
||||
export_types = list(/obj/structure/frame, /obj/structure/table_frame)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/large/pacman
|
||||
cost = 125
|
||||
unit_name = "pacman"
|
||||
export_types = list(/obj/machinery/power/port_gen/pacman)
|
||||
|
||||
/datum/export/large/pacman
|
||||
cost = 150
|
||||
unit_name = "super pacman"
|
||||
export_types = list(/obj/machinery/power/port_gen/pacman/super)
|
||||
|
||||
/datum/export/large/pacman
|
||||
cost = 175
|
||||
unit_name = "mrs super pacman"
|
||||
export_types = list(/obj/machinery/power/port_gen/pacman/mrs)
|
||||
|
||||
/datum/export/large/hydroponics
|
||||
cost = 120
|
||||
unit_name = "hydroponics tray"
|
||||
export_types = list(/obj/machinery/hydroponics)
|
||||
|
||||
/datum/export/large/nice_chair
|
||||
cost = 12
|
||||
unit_name = "Padded Chair"
|
||||
export_types = list(/obj/structure/chair/comfy)
|
||||
|
||||
/datum/export/large/gas_canister
|
||||
cost = 10 //Base cost of canister. You get more for nice gases inside.
|
||||
unit_name = "Gas Canister"
|
||||
export_types = list(/obj/machinery/portable_atmospherics/canister)
|
||||
|
||||
/datum/export/large/gas_canister/get_cost(obj/O)
|
||||
var/obj/machinery/portable_atmospherics/canister/C = O
|
||||
var/worth = 10
|
||||
var/gases = C.air_contents.gases
|
||||
|
||||
worth += gases[/datum/gas/bz]*4
|
||||
worth += gases[/datum/gas/stimulum]*25
|
||||
worth += gases[/datum/gas/hypernoblium]*1000
|
||||
worth += gases[/datum/gas/miasma]*4
|
||||
worth += gases[/datum/gas/tritium]*7
|
||||
worth += gases[/datum/gas/pluoxium]*6
|
||||
worth += gases[/datum/gas/nitryl]*30
|
||||
return worth
|
||||
|
||||
|
||||
//////////////
|
||||
//Matstatues//
|
||||
//////////////
|
||||
|
||||
/datum/export/large/nukestatue
|
||||
cost = 175
|
||||
unit_name = "Nuke statue"
|
||||
export_types = list(/obj/structure/statue/uranium/nuke)
|
||||
|
||||
/datum/export/large/engstatue
|
||||
cost = 175
|
||||
unit_name = "Engine statue"
|
||||
export_types = list(/obj/structure/statue/uranium/eng)
|
||||
|
||||
/datum/export/large/plasmastatue
|
||||
cost = 720
|
||||
unit_name = "Scientist statue"
|
||||
export_types = list(/obj/structure/statue/plasma/scientist)
|
||||
|
||||
/datum/export/large/hosstatue
|
||||
cost = 225
|
||||
unit_name = "HoS statue"
|
||||
export_types = list(/obj/structure/statue/gold/hos)
|
||||
|
||||
/datum/export/large/rdstatue
|
||||
cost = 225
|
||||
unit_name = "RD statue"
|
||||
export_types = list(/obj/structure/statue/gold/rd)
|
||||
|
||||
/datum/export/large/hopstatue
|
||||
cost = 225
|
||||
unit_name = "HoP statue"
|
||||
export_types = list(/obj/structure/statue/gold/hop)
|
||||
|
||||
/datum/export/large/cmostatue
|
||||
cost = 225
|
||||
unit_name = "CMO statue"
|
||||
export_types = list(/obj/structure/statue/gold/cmo)
|
||||
|
||||
/datum/export/large/cestatue
|
||||
cost = 225
|
||||
unit_name = "CE statue"
|
||||
export_types = list(/obj/structure/statue/gold/ce)
|
||||
|
||||
/datum/export/large/mdstatue
|
||||
cost = 200
|
||||
unit_name = "MD statue"
|
||||
export_types = list(/obj/structure/statue/silver/md)
|
||||
|
||||
/datum/export/large/janitorstatue
|
||||
cost = 200
|
||||
unit_name = "Janitor statue"
|
||||
export_types = list(/obj/structure/statue/silver/janitor)
|
||||
|
||||
/datum/export/large/secstatue
|
||||
cost = 200
|
||||
unit_name = "Sec statue"
|
||||
export_types = list(/obj/structure/statue/silver/sec)
|
||||
|
||||
/datum/export/large/medborgstatue
|
||||
cost = 200
|
||||
unit_name = "Medborg statue"
|
||||
export_types = list(/obj/structure/statue/silver/medborg)
|
||||
|
||||
/datum/export/large/secborgstatue
|
||||
cost = 200
|
||||
unit_name = "Secborg statue"
|
||||
export_types = list(/obj/structure/statue/silver/secborg)
|
||||
|
||||
/datum/export/large/capstatue
|
||||
cost = 1200
|
||||
unit_name = "Captain statue"
|
||||
export_types = list(/obj/structure/statue/diamond/captain)
|
||||
|
||||
/datum/export/large/aistatue
|
||||
cost = 1200
|
||||
unit_name = "AI statue"
|
||||
export_types = list(/obj/structure/statue/diamond/ai1, /obj/structure/statue/diamond/ai2)
|
||||
|
||||
/datum/export/large/clownstatue
|
||||
cost = 2750
|
||||
unit_name = "Clown statue"
|
||||
export_types = list(/obj/structure/statue/bananium/clown)
|
||||
|
||||
/datum/export/large/sandstatue
|
||||
cost = 90 //Big cash
|
||||
unit_name = "sandstone statue"
|
||||
export_types = list(/obj/structure/statue/sandstone/assistant)
|
||||
|
||||
////////////
|
||||
//MECHS/////
|
||||
////////////
|
||||
|
||||
/datum/export/large/mech
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/large/mech/odysseus
|
||||
cost = 7500
|
||||
unit_name = "working odysseus"
|
||||
export_types = list(/obj/mecha/medical/odysseus)
|
||||
|
||||
/datum/export/large/mech/ripley
|
||||
cost = 12000
|
||||
unit_name = "working ripley"
|
||||
export_types = list(/obj/mecha/working/ripley)
|
||||
|
||||
/datum/export/large/mech/firefighter
|
||||
cost = 14000
|
||||
unit_name = "working firefighter"
|
||||
export_types = list(/obj/mecha/working/ripley/firefighter)
|
||||
|
||||
/datum/export/large/mech/gygax
|
||||
cost = 19000
|
||||
unit_name = "working gygax"
|
||||
export_types = list(/obj/mecha/combat/gygax)
|
||||
|
||||
/datum/export/large/mech/durand
|
||||
cost = 16000
|
||||
unit_name = "working durand"
|
||||
export_types = list(/obj/mecha/combat/durand)
|
||||
|
||||
/datum/export/large/mech/phazon
|
||||
cost = 35000 //Little over half do to needing a core
|
||||
unit_name = "working phazon"
|
||||
export_types = list(/obj/mecha/combat/phazon)
|
||||
|
||||
/datum/export/large/mech/marauder
|
||||
cost = 15000 //Still a Combat class mech - CC tech as well! 150% "normal" boundy price.
|
||||
unit_name = "working marauder"
|
||||
export_types = list(/obj/mecha/combat/marauder)
|
||||
|
||||
/datum/export/large/mech/deathripley
|
||||
cost = 18500 //Still a "Combat class" mech - Illegal tech as well! 165% "normal" boundy price.
|
||||
unit_name = "working illegally modified"
|
||||
export_types = list(/obj/mecha/working/ripley/deathripley)
|
||||
|
||||
/datum/export/large/mech/gygaxdark
|
||||
cost = 28500 //Still a Combat class mech - Illegal tech as well! 150% "normal" boundy price.
|
||||
unit_name = "working illegally modified gygax"
|
||||
export_types = list(/obj/mecha/combat/gygax/dark)
|
||||
|
||||
/datum/export/large/mech/oldripley
|
||||
cost = 6250 //old mech - Scrap metal ! 50% "normal" boundy price.
|
||||
unit_name = "working miner ripley"
|
||||
export_types = list(/obj/mecha/working/ripley/mining)
|
||||
|
||||
/datum/export/large/mech/honk
|
||||
cost = 16000 //Still a "Combat class" mech - Comats bordem honk!
|
||||
unit_name = "working honker"
|
||||
export_types = list(/obj/mecha/combat/honker)
|
||||
|
||||
/datum/export/large/mech/reticence
|
||||
cost = 16000 //Still a "Combat class" mech - Has cloking and lethal weaponds.
|
||||
unit_name = "working reticence"
|
||||
export_types = list(/obj/mecha/combat/reticence)
|
||||
|
||||
/datum/export/large/mech/seraph
|
||||
cost = 25500 //Still a Combat class mech - CC tech as well! 150% "normal" boundy price.
|
||||
unit_name = "working seraph"
|
||||
export_types = list(/obj/mecha/combat/marauder/seraph)
|
||||
|
||||
/datum/export/large/mech/mauler
|
||||
cost = 25000 //Still a Combat class mech - CC lethal weaponds.
|
||||
unit_name = "working legally modified marauder"
|
||||
export_types = list(/obj/mecha/combat/marauder/mauler)
|
||||
@@ -0,0 +1,94 @@
|
||||
// Approved manifest.
|
||||
// +200 credits flat.
|
||||
/datum/export/manifest_correct
|
||||
cost = 200
|
||||
k_elasticity = 0
|
||||
unit_name = "approved manifest"
|
||||
export_types = list(/obj/item/paper/fluff/jobs/cargo/manifest)
|
||||
|
||||
/datum/export/manifest_correct/applies_to(obj/O)
|
||||
if(!..())
|
||||
return FALSE
|
||||
|
||||
var/obj/item/paper/fluff/jobs/cargo/manifest/M = O
|
||||
if(M.is_approved() && !M.errors)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
// Correctly denied manifest.
|
||||
// Refunds the package cost minus the cost of crate.
|
||||
/datum/export/manifest_error_denied
|
||||
cost = -500
|
||||
k_elasticity = 0
|
||||
unit_name = "correctly denied manifest"
|
||||
export_types = list(/obj/item/paper/fluff/jobs/cargo/manifest)
|
||||
|
||||
/datum/export/manifest_error_denied/applies_to(obj/O)
|
||||
if(!..())
|
||||
return FALSE
|
||||
|
||||
var/obj/item/paper/fluff/jobs/cargo/manifest/M = O
|
||||
if(M.is_denied() && M.errors)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/export/manifest_error_denied/get_cost(obj/O)
|
||||
var/obj/item/paper/fluff/jobs/cargo/manifest/M = O
|
||||
return ..() + M.order_cost
|
||||
|
||||
|
||||
// Erroneously approved manifest.
|
||||
// Substracts the package cost.
|
||||
/datum/export/manifest_error
|
||||
unit_name = "erroneously approved manifest"
|
||||
export_types = list(/obj/item/paper/fluff/jobs/cargo/manifest)
|
||||
|
||||
/datum/export/manifest_error/applies_to(obj/O)
|
||||
if(!..())
|
||||
return FALSE
|
||||
|
||||
var/obj/item/paper/fluff/jobs/cargo/manifest/M = O
|
||||
if(M.is_approved() && M.errors)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/export/manifest_error/get_cost(obj/O)
|
||||
var/obj/item/paper/fluff/jobs/cargo/manifest/M = O
|
||||
return -M.order_cost
|
||||
|
||||
|
||||
// Erroneously denied manifest.
|
||||
// Substracts the package cost minus the cost of crate.
|
||||
/datum/export/manifest_correct_denied
|
||||
cost = 500
|
||||
unit_name = "erroneously denied manifest"
|
||||
export_types = list(/obj/item/paper/fluff/jobs/cargo/manifest)
|
||||
|
||||
/datum/export/manifest_correct_denied/applies_to(obj/O)
|
||||
if(!..())
|
||||
return FALSE
|
||||
|
||||
var/obj/item/paper/fluff/jobs/cargo/manifest/M = O
|
||||
if(M.is_denied() && !M.errors)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/export/manifest_correct_denied/get_cost(obj/O)
|
||||
var/obj/item/paper/fluff/jobs/cargo/manifest/M = O
|
||||
return ..() - M.order_cost
|
||||
|
||||
// Paper work done correctly
|
||||
|
||||
/datum/export/paperwork_correct
|
||||
cost = 120 // finicky number 20 x 120 = 2400 per crate
|
||||
k_elasticity = 0
|
||||
unit_name = "correct paperwork"
|
||||
export_types = list(/obj/item/folder/paperwork_correct)
|
||||
|
||||
// Paper work not done retruned
|
||||
|
||||
/datum/export/paperwork_incorrect
|
||||
cost = -500 // Failed to meet NT standers
|
||||
k_elasticity = 0
|
||||
unit_name = "returned incorrect paperwork"
|
||||
export_types = list(/obj/item/folder/paperwork)
|
||||
@@ -0,0 +1,91 @@
|
||||
/datum/export/material
|
||||
k_elasticity = 0
|
||||
cost = 5 // Cost per MINERAL_MATERIAL_AMOUNT, which is 2000cm3 as of April 2016.
|
||||
message = "cm3 of developer's tears. Please, report this on github"
|
||||
var/material_id = null
|
||||
export_types = list(
|
||||
/obj/item/stack/sheet/mineral, /obj/item/stack/tile/mineral,
|
||||
/obj/item/stack/ore, /obj/item/coin)
|
||||
// Yes, it's a base type containing export_types.
|
||||
// But it has no material_id, so any applies_to check will return false, and these types reduce amount of copypasta a lot
|
||||
|
||||
/datum/export/material/get_amount(obj/O)
|
||||
if(!material_id)
|
||||
return 0
|
||||
if(!isitem(O))
|
||||
return 0
|
||||
var/obj/item/I = O
|
||||
if(!(material_id in I.materials))
|
||||
return 0
|
||||
|
||||
var/amount = I.materials[material_id]
|
||||
|
||||
if(istype(I, /obj/item/stack))
|
||||
var/obj/item/stack/S = I
|
||||
amount *= S.amount
|
||||
if(istype(I, /obj/item/stack/ore))
|
||||
amount *= 0.8 // Station's ore redemption equipment is really goddamn good.
|
||||
|
||||
return round(amount/MINERAL_MATERIAL_AMOUNT)
|
||||
|
||||
// Materials. Selling raw can lead to a big payout but takes a lot of work for miners to get a lot. Best to craft art/rnd gear
|
||||
|
||||
/datum/export/material/bananium
|
||||
cost = 500
|
||||
material_id = MAT_BANANIUM
|
||||
message = "cm3 of bananium"
|
||||
|
||||
/datum/export/material/diamond
|
||||
cost = 250
|
||||
material_id = MAT_DIAMOND
|
||||
message = "cm3 of diamonds"
|
||||
|
||||
/datum/export/material/plasma
|
||||
cost = 100
|
||||
material_id = MAT_PLASMA
|
||||
message = "cm3 of plasma"
|
||||
|
||||
/datum/export/material/uranium
|
||||
cost = 50
|
||||
material_id = MAT_URANIUM
|
||||
message = "cm3 of uranium"
|
||||
|
||||
/datum/export/material/gold
|
||||
cost = 60
|
||||
material_id = MAT_GOLD
|
||||
message = "cm3 of gold"
|
||||
|
||||
/datum/export/material/silver
|
||||
cost = 25
|
||||
material_id = MAT_SILVER
|
||||
message = "cm3 of silver"
|
||||
|
||||
/datum/export/material/titanium
|
||||
cost = 60
|
||||
material_id = MAT_TITANIUM
|
||||
message = "cm3 of titanium"
|
||||
|
||||
/datum/export/material/plastitanium
|
||||
cost = 165 // plasma + titanium costs
|
||||
material_id = MAT_TITANIUM // code can only check for one material_id; plastitanium is half plasma, half titanium
|
||||
message = "cm3 of plastitanium"
|
||||
|
||||
/datum/export/material/plastic
|
||||
cost = 5
|
||||
material_id = MAT_PLASTIC
|
||||
message = "cm3 of plastic"
|
||||
|
||||
/datum/export/material/metal
|
||||
cost = 3
|
||||
message = "cm3 of metal"
|
||||
material_id = MAT_METAL
|
||||
export_types = list(
|
||||
/obj/item/stack/sheet/metal, /obj/item/stack/tile/plasteel,
|
||||
/obj/item/stack/rods, /obj/item/stack/ore, /obj/item/coin)
|
||||
|
||||
/datum/export/material/glass
|
||||
cost = 3
|
||||
message = "cm3 of glass"
|
||||
material_id = MAT_GLASS
|
||||
export_types = list(/obj/item/stack/sheet/glass, /obj/item/stack/ore,
|
||||
/obj/item/shard)
|
||||
@@ -0,0 +1,102 @@
|
||||
// Circuit boards, spare parts, etc.
|
||||
|
||||
/datum/export/solar/assembly
|
||||
cost = 50
|
||||
unit_name = "solar panel assembly"
|
||||
export_types = list(/obj/item/solar_assembly)
|
||||
|
||||
/datum/export/solar/tracker_board
|
||||
cost = 10
|
||||
unit_name = "solar tracker board"
|
||||
export_types = list(/obj/item/electronics/tracker)
|
||||
|
||||
/datum/export/solar/control_board
|
||||
cost = 15
|
||||
unit_name = "solar panel control board"
|
||||
export_types = list(/obj/item/circuitboard/computer/solar_control)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/swarmer
|
||||
cost = 500
|
||||
unit_name = "deactivated alien deconstruction drone"
|
||||
export_types = list(/obj/item/deactivated_swarmer)
|
||||
|
||||
//Board
|
||||
|
||||
/datum/export/board
|
||||
cost = 5
|
||||
unit_name = "circuit board"
|
||||
export_types = list(/obj/item/circuitboard)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/board/SMES
|
||||
cost = 20
|
||||
unit_name = "smes board"
|
||||
export_types = list(/obj/item/circuitboard/machine/smes)
|
||||
include_subtypes = FALSE
|
||||
|
||||
//Stock Parts
|
||||
|
||||
/datum/export/subspace
|
||||
cost = 3
|
||||
unit_name = "subspace part"
|
||||
export_types = list(/obj/item/stock_parts/subspace)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/t1
|
||||
cost = 1
|
||||
unit_name = "basic stock part"
|
||||
export_types = list(/obj/item/stock_parts/capacitor, /obj/item/stock_parts/scanning_module, /obj/item/stock_parts/manipulator, /obj/item/stock_parts/micro_laser, /obj/item/stock_parts/matter_bin)
|
||||
|
||||
/datum/export/t2
|
||||
cost = 2
|
||||
unit_name = "upgraded stock part"
|
||||
export_types = list(/obj/item/stock_parts/capacitor/adv, /obj/item/stock_parts/scanning_module/adv, /obj/item/stock_parts/manipulator/nano, /obj/item/stock_parts/micro_laser/high, /obj/item/stock_parts/matter_bin/adv)
|
||||
|
||||
/datum/export/t3
|
||||
cost = 3
|
||||
unit_name = "advanced stock part"
|
||||
export_types = list(/obj/item/stock_parts/capacitor/super, /obj/item/stock_parts/scanning_module/phasic, /obj/item/stock_parts/manipulator/pico, /obj/item/stock_parts/micro_laser/ultra, /obj/item/stock_parts/matter_bin/super)
|
||||
|
||||
/datum/export/t4
|
||||
cost = 4
|
||||
unit_name = "blue space stock part"
|
||||
export_types = list(/obj/item/stock_parts/capacitor/quadratic, /obj/item/stock_parts/scanning_module/triphasic, /obj/item/stock_parts/manipulator/femto, /obj/item/stock_parts/micro_laser/quadultra, /obj/item/stock_parts/matter_bin/bluespace)
|
||||
|
||||
//Cells
|
||||
|
||||
/datum/export/cell
|
||||
cost = 5
|
||||
unit_name = "power cell"
|
||||
export_types = list(/obj/item/stock_parts/cell)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/cellupgraded
|
||||
cost = 10
|
||||
unit_name = "upgraded power cell"
|
||||
export_types = list(/obj/item/stock_parts/cell/upgraded, /obj/item/stock_parts/cell/upgraded/plus)
|
||||
|
||||
/datum/export/cellhigh
|
||||
cost = 15
|
||||
unit_name = "high power cell"
|
||||
export_types = list(/obj/item/stock_parts/cell/high, /obj/item/stock_parts/cell/high/plus)
|
||||
|
||||
/datum/export/cellhyper
|
||||
cost = 20
|
||||
unit_name = "super-capacity power cell"
|
||||
export_types = list(/obj/item/stock_parts/cell/super, /obj/item/stock_parts/cell/hyper)
|
||||
|
||||
/datum/export/cellbs
|
||||
cost = 25
|
||||
unit_name = "bluespace power cell"
|
||||
export_types = list(/obj/item/stock_parts/cell/bluespace)
|
||||
|
||||
/datum/export/cellyellow
|
||||
cost = 40
|
||||
unit_name = "slime power cell"
|
||||
export_types = list(/obj/item/stock_parts/cell/high/slime)
|
||||
|
||||
/datum/export/cellyellowhyper
|
||||
cost = 120 //Takes a lot to make and is really good
|
||||
unit_name = "hyper slime power cell"
|
||||
export_types = list(/obj/item/stock_parts/cell/high/slime/hypercharged)
|
||||
@@ -0,0 +1,38 @@
|
||||
/datum/export/seed
|
||||
cost = 50 // Gets multiplied by potency
|
||||
k_elasticity = 1 //price inelastic/quantity elastic, only need to export a few samples
|
||||
unit_name = "new plant species sample"
|
||||
export_types = list(/obj/item/seeds)
|
||||
var/needs_discovery = FALSE // Only for undiscovered species
|
||||
var/static/list/discoveredPlants = list()
|
||||
|
||||
/datum/export/seed/get_cost(obj/O)
|
||||
var/obj/item/seeds/S = O
|
||||
if(!needs_discovery && (S.type in discoveredPlants))
|
||||
return 0
|
||||
if(needs_discovery && !(S.type in discoveredPlants))
|
||||
return 0
|
||||
return ..() * S.rarity // That's right, no bonus for potency. Send a crappy sample first to "show improvement" later.
|
||||
|
||||
/datum/export/seed/sell_object(obj/O)
|
||||
. = ..()
|
||||
if(.)
|
||||
var/obj/item/seeds/S = O
|
||||
discoveredPlants[S.type] = S.potency
|
||||
|
||||
|
||||
/datum/export/seed/potency
|
||||
cost = 2.5 // Gets multiplied by potency and rarity.
|
||||
unit_name = "improved plant sample"
|
||||
export_types = list(/obj/item/seeds)
|
||||
needs_discovery = TRUE // Only for already discovered species
|
||||
|
||||
/datum/export/seed/potency/get_cost(obj/O)
|
||||
var/obj/item/seeds/S = O
|
||||
var/cost = ..()
|
||||
if(!cost)
|
||||
return 0
|
||||
|
||||
var/potDiff = (S.potency - discoveredPlants[S.type])
|
||||
|
||||
return round(..() * potDiff)
|
||||
@@ -0,0 +1,159 @@
|
||||
/datum/export/stack
|
||||
unit_name = "sheet"
|
||||
k_elasticity = 0
|
||||
|
||||
/datum/export/stack/get_amount(obj/O)
|
||||
var/obj/item/stack/S = O
|
||||
if(istype(S))
|
||||
return S.amount
|
||||
return 0
|
||||
|
||||
// Hides
|
||||
|
||||
/datum/export/stack/leather
|
||||
cost = 30
|
||||
unit_name = "leather"
|
||||
export_types = list(/obj/item/stack/sheet/leather)
|
||||
|
||||
/datum/export/stack/skin/monkey
|
||||
cost = 30
|
||||
unit_name = "monkey hide"
|
||||
export_types = list(/obj/item/stack/sheet/animalhide/monkey)
|
||||
|
||||
/datum/export/stack/skin/human
|
||||
cost = 70
|
||||
export_category = EXPORT_CONTRABAND
|
||||
unit_name = "piece"
|
||||
message = "of human skin"
|
||||
export_types = list(/obj/item/stack/sheet/animalhide/human)
|
||||
|
||||
/datum/export/stack/skin/goliath_hide
|
||||
cost = 160
|
||||
unit_name = "goliath hide"
|
||||
export_types = list(/obj/item/stack/sheet/animalhide/goliath_hide)
|
||||
|
||||
/datum/export/stack/skin/cat
|
||||
cost = 120
|
||||
export_category = EXPORT_CONTRABAND
|
||||
unit_name = "cat hide"
|
||||
export_types = list(/obj/item/stack/sheet/animalhide/cat)
|
||||
|
||||
/datum/export/stack/skin/corgi
|
||||
cost = 140
|
||||
export_category = EXPORT_CONTRABAND
|
||||
unit_name = "corgi hide"
|
||||
export_types = list(/obj/item/stack/sheet/animalhide/corgi)
|
||||
|
||||
/datum/export/stack/skin/lizard
|
||||
cost = 50
|
||||
unit_name = "lizard hide"
|
||||
export_types = list(/obj/item/stack/sheet/animalhide/lizard)
|
||||
|
||||
/datum/export/stack/skin/gondola
|
||||
cost = 1000
|
||||
unit_name = "gondola hide"
|
||||
export_types = list(/obj/item/stack/sheet/animalhide/gondola)
|
||||
|
||||
/datum/export/stack/skin/xeno
|
||||
cost = 300
|
||||
unit_name = "alien hide"
|
||||
export_types = list(/obj/item/stack/sheet/animalhide/xeno)
|
||||
|
||||
// Common materials.
|
||||
// For base materials, see materials.dm
|
||||
|
||||
/datum/export/stack/plasteel
|
||||
cost = 105 // 2000u of plasma + 2000u of metal.
|
||||
message = "of plasteel"
|
||||
export_types = list(/obj/item/stack/sheet/plasteel)
|
||||
|
||||
// 1 glass + 0.5 metal, cost is rounded up.
|
||||
/datum/export/stack/rglass
|
||||
cost = 6
|
||||
message = "of reinforced glass"
|
||||
export_types = list(/obj/item/stack/sheet/rglass)
|
||||
|
||||
/datum/export/stack/bscrystal
|
||||
cost = 150
|
||||
message = "of bluespace crystals"
|
||||
export_types = list(/obj/item/stack/sheet/bluespace_crystal)
|
||||
|
||||
/datum/export/stack/wood
|
||||
cost = 15
|
||||
unit_name = "wood plank"
|
||||
export_types = list(/obj/item/stack/sheet/mineral/wood)
|
||||
|
||||
/datum/export/stack/log
|
||||
cost = 10
|
||||
unit_name = "raw wood"
|
||||
export_types = list(/obj/item/grown/log)
|
||||
|
||||
/datum/export/stack/cardboard
|
||||
cost = 2
|
||||
message = "of cardboard"
|
||||
export_types = list(/obj/item/stack/sheet/cardboard)
|
||||
|
||||
/datum/export/stack/sandstone
|
||||
cost = 1
|
||||
unit_name = "block"
|
||||
message = "of sandstone"
|
||||
export_types = list(/obj/item/stack/sheet/mineral/sandstone)
|
||||
|
||||
/datum/export/stack/cable
|
||||
cost = 0.2
|
||||
unit_name = "cable piece"
|
||||
export_types = list(/obj/item/stack/cable_coil)
|
||||
|
||||
/datum/export/stack/cloth
|
||||
cost = 20
|
||||
unit_name = "sheets"
|
||||
message = "of cloth"
|
||||
export_types = list(/obj/item/stack/sheet/cloth)
|
||||
|
||||
/datum/export/stack/silk
|
||||
cost = 200 //The new plasma
|
||||
unit_name = "sheets"
|
||||
message = "of silk"
|
||||
export_types = list(/obj/item/stack/sheet/silk)
|
||||
|
||||
/datum/export/stack/duracloth
|
||||
cost = 40
|
||||
unit_name = "sheets"
|
||||
message = "of duracloth"
|
||||
export_types = list(/obj/item/stack/sheet/durathread)
|
||||
|
||||
// Weird Stuff
|
||||
|
||||
/datum/export/stack/abductor
|
||||
cost = 400
|
||||
message = "of alien alloy"
|
||||
export_types = list(/obj/item/stack/sheet/mineral/abductor)
|
||||
|
||||
/datum/export/stack/adamantine
|
||||
unit_name = "bar"
|
||||
cost = 250
|
||||
message = "of adamantine"
|
||||
export_types = list(/obj/item/stack/sheet/mineral/adamantine)
|
||||
|
||||
/datum/export/stack/bone
|
||||
cost = 20
|
||||
message = "of bones"
|
||||
export_types = list(/obj/item/stack/sheet/bone)
|
||||
|
||||
/datum/export/stack/bronze
|
||||
unit_name = "tiles"
|
||||
cost = 5
|
||||
message = "of brozne"
|
||||
export_types = list(/obj/item/stack/tile/bronze)
|
||||
|
||||
/datum/export/stack/brass
|
||||
unit_name = "tiles"
|
||||
cost = 50
|
||||
message = "of brass"
|
||||
export_types = list(/obj/item/stack/tile/brass)
|
||||
|
||||
/datum/export/stack/paper
|
||||
unit_name = "sheets"
|
||||
cost = 30
|
||||
message = "of paperframes"
|
||||
export_types = list(/obj/item/stack/sheet/paperframes)
|
||||
@@ -0,0 +1,214 @@
|
||||
/datum/export/toolbox
|
||||
cost = 6
|
||||
unit_name = "toolbox"
|
||||
export_types = list(/obj/item/storage/toolbox)
|
||||
|
||||
// mechanical toolbox: 22cr
|
||||
// emergency toolbox: 17-20cr
|
||||
// electrical toolbox: 36cr
|
||||
// robust: priceless
|
||||
|
||||
// Adv tools
|
||||
|
||||
/datum/export/gear/powerdrill
|
||||
cost = 25
|
||||
k_elasticity = 1/80 //Market can only take so much
|
||||
unit_name = "power tool"
|
||||
export_types = list(/obj/item/crowbar/power, /obj/item/screwdriver/power, \
|
||||
/obj/item/weldingtool/experimental, /obj/item/wirecutters/power, /obj/item/wrench/power)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/gear/advtool
|
||||
cost = 175
|
||||
k_elasticity = 0 //Only known to be made by 2 station, market is hungery for it
|
||||
unit_name = "adv tool"
|
||||
export_types = list(/obj/item/crowbar/advanced, /obj/item/crowbar/abductor, /obj/item/screwdriver/abductor, /obj/item/screwdriver/advanced, \
|
||||
/obj/item/weldingtool/abductor, /obj/item/weldingtool/advanced, /obj/item/wirecutters/abductor, /obj/item/wirecutters/advanced, \
|
||||
/obj/item/wrench/abductor, /obj/item/wrench/advanced)
|
||||
include_subtypes = TRUE
|
||||
|
||||
// Lights/Eletronic
|
||||
|
||||
/datum/export/lights
|
||||
cost = 10
|
||||
unit_name = "light fixer"
|
||||
export_types = list(/obj/item/wallframe/light_fixture)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/apc_board
|
||||
cost = 5
|
||||
unit_name = "apc electronics"
|
||||
export_types = list(/obj/item/electronics/apc)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/apc_frame
|
||||
cost = 3
|
||||
unit_name = "apc frame"
|
||||
export_types = list(/obj/item/wallframe/apc)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/floodlights
|
||||
cost = 15
|
||||
unit_name = "floodlight fixer"
|
||||
export_types = list(/obj/structure/floodlight_frame)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/bolbstubes
|
||||
cost = 1 //Time
|
||||
unit_name = "light replacement"
|
||||
export_types = list(/obj/item/light/tube, /obj/item/light/bulb)
|
||||
|
||||
/datum/export/lightreplacer
|
||||
cost = 20
|
||||
unit_name = "lightreplacer"
|
||||
export_types = list(/obj/item/lightreplacer)
|
||||
|
||||
// Basic tools
|
||||
/datum/export/basicmining
|
||||
cost = 30
|
||||
unit_name = "basic mining tool"
|
||||
export_types = list(/obj/item/pickaxe, /obj/item/pickaxe/mini, /obj/item/shovel, /obj/item/resonator)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/upgradedmining
|
||||
cost = 80
|
||||
unit_name = "mining tool"
|
||||
export_types = list(/obj/item/pickaxe/silver, /obj/item/pickaxe/drill, /obj/item/gun/energy/plasmacutter, /obj/item/resonator/upgraded)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/advdmining
|
||||
cost = 150
|
||||
unit_name = "advanced mining tool"
|
||||
export_types = list(/obj/item/pickaxe/diamond, /obj/item/pickaxe/drill/diamonddrill, /obj/item/pickaxe/drill/jackhammer, /obj/item/gun/energy/plasmacutter/adv)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/screwdriver
|
||||
cost = 2
|
||||
unit_name = "screwdriver"
|
||||
export_types = list(/obj/item/screwdriver)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/wrench
|
||||
cost = 2
|
||||
unit_name = "wrench"
|
||||
export_types = list(/obj/item/wrench)
|
||||
|
||||
/datum/export/crowbar
|
||||
cost = 2
|
||||
unit_name = "crowbar"
|
||||
export_types = list(/obj/item/crowbar)
|
||||
|
||||
/datum/export/wirecutters
|
||||
cost = 2
|
||||
unit_name = "pair"
|
||||
message = "of wirecutters"
|
||||
export_types = list(/obj/item/wirecutters)
|
||||
|
||||
/datum/export/weldingtool
|
||||
cost = 5
|
||||
unit_name = "welding tool"
|
||||
export_types = list(/obj/item/weldingtool)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/weldingtool/emergency
|
||||
cost = 2
|
||||
unit_name = "emergency welding tool"
|
||||
export_types = list(/obj/item/weldingtool/mini)
|
||||
|
||||
/datum/export/weldingtool/industrial
|
||||
cost = 10
|
||||
unit_name = "industrial welding tool"
|
||||
export_types = list(/obj/item/weldingtool/largetank, /obj/item/weldingtool/hugetank)
|
||||
|
||||
/datum/export/extinguisher
|
||||
cost = 10
|
||||
unit_name = "fire extinguisher"
|
||||
export_types = list(/obj/item/extinguisher)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/extinguisher/mini
|
||||
cost = 2
|
||||
unit_name = "pocket fire extinguisher"
|
||||
export_types = list(/obj/item/extinguisher/mini)
|
||||
|
||||
/datum/export/flashlight
|
||||
cost = 3
|
||||
unit_name = "flashlight"
|
||||
export_types = list(/obj/item/flashlight)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/flashlight/flare
|
||||
cost = 2
|
||||
unit_name = "flare"
|
||||
export_types = list(/obj/item/flashlight/flare)
|
||||
|
||||
/datum/export/flashlight/seclite
|
||||
cost = 5
|
||||
unit_name = "seclite"
|
||||
export_types = list(/obj/item/flashlight/seclite)
|
||||
|
||||
/datum/export/analyzer
|
||||
cost = 5
|
||||
unit_name = "analyzer"
|
||||
export_types = list(/obj/item/analyzer)
|
||||
|
||||
/datum/export/analyzer/t_scanner
|
||||
cost = 10
|
||||
unit_name = "t-ray scanner"
|
||||
export_types = list(/obj/item/t_scanner)
|
||||
|
||||
/datum/export/radio
|
||||
cost = 5
|
||||
unit_name = "radio"
|
||||
export_types = list(/obj/item/radio)
|
||||
exclude_types = list(/obj/item/radio/mech)
|
||||
|
||||
/datum/export/rcd
|
||||
cost = 100
|
||||
unit_name = "rapid construction device"
|
||||
export_types = list(/obj/item/construction/rcd)
|
||||
|
||||
/datum/export/rcd_ammo
|
||||
cost = 60
|
||||
unit_name = "compressed matter cardridge"
|
||||
export_types = list(/obj/item/rcd_ammo)
|
||||
|
||||
/datum/export/rpd
|
||||
cost = 100
|
||||
unit_name = "rapid piping device"
|
||||
export_types = list(/obj/item/pipe_dispenser)
|
||||
|
||||
/datum/export/rld
|
||||
cost = 150
|
||||
unit_name = "rapid light device"
|
||||
export_types = list(/obj/item/construction/rld)
|
||||
|
||||
/datum/export/rped
|
||||
cost = 100
|
||||
unit_name = "rapid part exchange device"
|
||||
export_types = list(/obj/item/storage/part_replacer)
|
||||
|
||||
/datum/export/bsrped
|
||||
cost = 200
|
||||
unit_name = "blue space part exchange device"
|
||||
export_types = list(/obj/item/storage/part_replacer/bluespace)
|
||||
|
||||
/datum/export/singulo //failsafe in case someone decides to ship a live singularity to CentCom without the corresponding bounty
|
||||
cost = 1
|
||||
unit_name = "singularity"
|
||||
export_types = list(/obj/singularity)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/singulo/total_printout(datum/export_report/ex, notes = TRUE)
|
||||
. = ..()
|
||||
if(. && notes)
|
||||
. += " ERROR: Invalid object detected."
|
||||
|
||||
/datum/export/singulo/tesla //see above
|
||||
unit_name = "energy ball"
|
||||
export_types = list(/obj/singularity/energy_ball)
|
||||
|
||||
/datum/export/singulo/tesla/total_printout(datum/export_report/ex, notes = TRUE)
|
||||
. = ..()
|
||||
if(. && notes)
|
||||
. += " ERROR: Unscheduled energy ball delivery detected."
|
||||
@@ -0,0 +1,357 @@
|
||||
// Weapon exports. Stun batons, disablers, etc.
|
||||
|
||||
/datum/export/weapon
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/weapon/makeshift_shield
|
||||
cost = 30
|
||||
unit_name = "unknown shield"
|
||||
export_types = list(/obj/item/shield/riot, /obj/item/shield/riot/roman, /obj/item/shield/riot/buckler, /obj/item/shield/makeshift)
|
||||
|
||||
/datum/export/weapon/riot_shield
|
||||
cost = 50
|
||||
unit_name = "riot shield"
|
||||
export_types = list(/obj/item/shield/riot, /obj/item/shield/riot/tower)
|
||||
|
||||
/datum/export/weapon/riot_shield
|
||||
cost = 70
|
||||
unit_name = "flash shield"
|
||||
export_types = list(/obj/item/assembly/flash/shield)
|
||||
|
||||
/datum/export/weapon/tele_shield
|
||||
cost = 100
|
||||
unit_name = "tele shield"
|
||||
export_types = list(/obj/item/shield/riot/tele, /obj/item/shield/energy)
|
||||
|
||||
/datum/export/weapon/baton
|
||||
cost = 100
|
||||
unit_name = "stun baton"
|
||||
export_types = list(/obj/item/melee/baton)
|
||||
exclude_types = list(/obj/item/melee/baton/cattleprod)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/weapon/knife
|
||||
cost = 100
|
||||
unit_name = "combat knife"
|
||||
export_types = list(/obj/item/kitchen/knife/combat)
|
||||
|
||||
/datum/export/weapon/taser
|
||||
cost = 200
|
||||
unit_name = "advanced taser"
|
||||
export_types = list(/obj/item/gun/energy/e_gun/advtaser)
|
||||
|
||||
/datum/export/weapon/laser
|
||||
cost = 200
|
||||
unit_name = "laser gun"
|
||||
export_types = list(/obj/item/gun/energy/laser)
|
||||
|
||||
/datum/export/weapon/disabler
|
||||
cost = 50
|
||||
unit_name = "disabler"
|
||||
export_types = list(/obj/item/gun/energy/disabler)
|
||||
|
||||
/datum/export/weapon/energy_gun
|
||||
cost = 200
|
||||
unit_name = "energy gun"
|
||||
export_types = list(/obj/item/gun/energy/e_gun)
|
||||
|
||||
/datum/export/weapon/wt550
|
||||
cost = 130
|
||||
unit_name = "WT-550 automatic rifle"
|
||||
export_types = list(/obj/item/gun/ballistic/automatic/wt550)
|
||||
|
||||
/datum/export/weapon/shotgun
|
||||
cost = 200
|
||||
unit_name = "combat shotgun"
|
||||
export_types = list(/obj/item/gun/ballistic/shotgun/automatic/combat)
|
||||
|
||||
/datum/export/weapon/flashbang
|
||||
cost = 5
|
||||
unit_name = "flashbang grenade"
|
||||
export_types = list(/obj/item/grenade/flashbang)
|
||||
|
||||
/datum/export/weapon/teargas
|
||||
cost = 5
|
||||
unit_name = "tear gas grenade"
|
||||
export_types = list(/obj/item/grenade/chem_grenade/teargas)
|
||||
|
||||
/datum/export/weapon/flash
|
||||
cost = 5
|
||||
unit_name = "handheld flash"
|
||||
export_types = list(/obj/item/assembly/flash)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/weapon/handcuffs
|
||||
cost = 3
|
||||
unit_name = "pair"
|
||||
message = "of handcuffs"
|
||||
export_types = list(/obj/item/restraints/handcuffs)
|
||||
|
||||
//////////////
|
||||
//RND Guns////
|
||||
//////////////
|
||||
|
||||
/datum/export/weapon/lasercarbine
|
||||
cost = 120
|
||||
unit_name = "laser carbine"
|
||||
export_types = list(/obj/item/gun/energy/laser/carbine)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/weapon/teslagun
|
||||
cost = 130
|
||||
unit_name = "tesla revolver"
|
||||
export_types = list(/obj/item/gun/energy/tesla_revolver)
|
||||
|
||||
/datum/export/weapon/aeg
|
||||
cost = 200 //Endless power
|
||||
unit_name = "advance engery gun"
|
||||
export_types = list(/obj/item/gun/energy/e_gun/nuclear)
|
||||
|
||||
/datum/export/weapon/deconer
|
||||
cost = 600
|
||||
unit_name = "deconer"
|
||||
export_types = list(/obj/item/gun/energy/decloner)
|
||||
|
||||
/datum/export/weapon/ntsniper
|
||||
cost = 500
|
||||
unit_name = "beam rifle"
|
||||
export_types = list(/obj/item/gun/energy/beam_rifle)
|
||||
|
||||
/datum/export/weapon/needle_gun
|
||||
cost = 50
|
||||
unit_name = "syringe revolver"
|
||||
export_types = list(/obj/item/gun/syringe/rapidsyringe)
|
||||
|
||||
/datum/export/weapon/temp_gun
|
||||
cost = 175 //Its just smaller
|
||||
unit_name = "small temperature gun"
|
||||
k_elasticity = 1/30 //Its just a smaller temperature gun, easy to mass make
|
||||
export_types = list(/obj/item/gun/energy/temperature)
|
||||
|
||||
/datum/export/weapon/flowergun
|
||||
cost = 100
|
||||
unit_name = "floral somatoray"
|
||||
export_types = list(/obj/item/gun/energy/floragun)
|
||||
|
||||
/datum/export/weapon/xraygun
|
||||
cost = 300 //Wall hacks
|
||||
unit_name = "x ray gun"
|
||||
export_types = list(/obj/item/gun/energy/xray)
|
||||
|
||||
/datum/export/weapon/ioncarbine
|
||||
cost = 200
|
||||
k_elasticity = 1/30 //Its just a smaller temperature gun, easy to mass make
|
||||
unit_name = "ion carbine"
|
||||
export_types = list(/obj/item/gun/energy/ionrifle/carbine)
|
||||
|
||||
/datum/export/weapon/largeebow
|
||||
cost = 500
|
||||
unit_name = "crossbow"
|
||||
export_types = list(/obj/item/gun/energy/kinetic_accelerator/crossbow/large)
|
||||
|
||||
/datum/export/weapon/largebomb
|
||||
cost = 20
|
||||
unit_name = "large grenade"
|
||||
export_types = list(/obj/item/grenade/chem_grenade/large)
|
||||
|
||||
/datum/export/weapon/gravworm
|
||||
cost = 150
|
||||
unit_name = "bluespace weapon"
|
||||
export_types = list(/obj/item/gun/energy/wormhole_projector, /obj/item/gun/energy/gravity_gun)
|
||||
|
||||
/datum/export/weapon/cryopryo
|
||||
cost = 70
|
||||
unit_name = "heat based grenade"
|
||||
export_types = list(/obj/item/grenade/chem_grenade/pyro, /obj/item/grenade/chem_grenade/cryo)
|
||||
|
||||
/datum/export/weapon/advgrenade
|
||||
cost = 80
|
||||
unit_name = "advanced grenade"
|
||||
export_types = list(/obj/item/grenade/chem_grenade/adv_release)
|
||||
|
||||
/////////////////
|
||||
//Ammo and Pins//
|
||||
/////////////////
|
||||
|
||||
/datum/export/weapon/wtammo
|
||||
cost = 15
|
||||
unit_name = "WT-550 automatic rifle ammo"
|
||||
export_types = list(/obj/item/ammo_box/magazine/wt550m9, /obj/item/ammo_box/magazine/wt550m9/wtrubber)
|
||||
|
||||
/datum/export/weapon/wtammo/advanced
|
||||
cost = 45
|
||||
unit_name = "advanced WT-550 automatic rifle ammo"
|
||||
export_types = list( /obj/item/ammo_box/magazine/wt550m9/wtap, /obj/item/ammo_box/magazine/wt550m9/wttx, /obj/item/ammo_box/magazine/wt550m9/wtic)
|
||||
|
||||
/datum/export/weapon/mindshield
|
||||
cost = 80
|
||||
unit_name = "mindshield locked pin"
|
||||
export_types = list(/obj/item/firing_pin/implant/mindshield)
|
||||
|
||||
/datum/export/weapon/testrange
|
||||
cost = 20
|
||||
unit_name = "test range pin"
|
||||
export_types = list(/obj/item/firing_pin/test_range)
|
||||
|
||||
/datum/export/weapon/techslug
|
||||
cost = 25
|
||||
k_elasticity = 0
|
||||
unit_name = "advanced shotgun shell"
|
||||
export_types = list(/obj/item/ammo_casing/shotgun/dragonsbreath, /obj/item/ammo_casing/shotgun/meteorslug, /obj/item/ammo_casing/shotgun/pulseslug, /obj/item/ammo_casing/shotgun/frag12, /obj/item/ammo_casing/shotgun/ion, /obj/item/ammo_casing/shotgun/laserslug)
|
||||
|
||||
/////////////////////////
|
||||
//The Traitor Sell Outs//
|
||||
/////////////////////////
|
||||
|
||||
/datum/export/weapon/pistol
|
||||
cost = 120
|
||||
unit_name = "illegal firearm"
|
||||
export_types = list(/obj/item/gun/ballistic/automatic/pistol)
|
||||
|
||||
/datum/export/weapon/revolver
|
||||
cost = 200
|
||||
unit_name = "large handgun"
|
||||
export_types = list(/obj/item/gun/ballistic/revolver)
|
||||
exclude_types = list(/obj/item/gun/ballistic/revolver/russian, /obj/item/gun/ballistic/revolver/doublebarrel)
|
||||
|
||||
/datum/export/weapon/rocketlauncher
|
||||
cost = 1000
|
||||
unit_name = "rocketlauncher"
|
||||
export_types = list(/obj/item/gun/ballistic/rocketlauncher)
|
||||
|
||||
/datum/export/weapon/antitank
|
||||
cost = 300
|
||||
unit_name = "hand cannon"
|
||||
export_types = list(/obj/item/gun/ballistic/automatic/pistol/antitank/syndicate)
|
||||
|
||||
/datum/export/weapon/clownstuff
|
||||
cost = 500
|
||||
unit_name = "clown war tech"
|
||||
export_types = list(/obj/item/pneumatic_cannon/pie/selfcharge, /obj/item/shield/energy/bananium, /obj/item/melee/transforming/energy/sword/bananium, )
|
||||
|
||||
/datum/export/weapon/bulldog
|
||||
cost = 400
|
||||
unit_name = "drum loaded shotgun"
|
||||
export_types = list(/obj/item/gun/ballistic/automatic/shotgun/bulldog)
|
||||
|
||||
/datum/export/weapon/smg
|
||||
cost = 350
|
||||
unit_name = "automatic c-20r"
|
||||
export_types = list(/obj/item/gun/ballistic/automatic/c20r)
|
||||
|
||||
/datum/export/weapon/duelsaber
|
||||
cost = 360 //Get it?
|
||||
unit_name = "energy saber"
|
||||
export_types = list(/obj/item/twohanded/dualsaber)
|
||||
|
||||
/datum/export/weapon/esword
|
||||
cost = 130
|
||||
unit_name = "energy sword"
|
||||
export_types = list(/obj/item/melee/transforming/energy/sword/cx/traitor, /obj/item/melee/transforming/energy/sword/saber)
|
||||
|
||||
/datum/export/weapon/rapier
|
||||
cost = 150
|
||||
unit_name = "rapier"
|
||||
export_types = list(/obj/item/storage/belt/sabre/rapier)
|
||||
|
||||
/datum/export/weapon/flamer
|
||||
cost = 20 //welder + some rods cheap
|
||||
unit_name = "flamethrower"
|
||||
export_types = list(/obj/item/flamethrower)
|
||||
|
||||
/datum/export/weapon/gloves
|
||||
cost = 90
|
||||
unit_name = "star struck gloves"
|
||||
export_types = list(/obj/item/clothing/gloves/rapid)
|
||||
|
||||
/datum/export/weapon/l6
|
||||
cost = 500
|
||||
unit_name = "law 6 saw"
|
||||
export_types = list(/obj/item/gun/ballistic/automatic/l6_saw)
|
||||
|
||||
/datum/export/weapon/m90
|
||||
cost = 400
|
||||
unit_name = "assault class weapon"
|
||||
export_types = list(/obj/item/gun/ballistic/automatic/m90)
|
||||
|
||||
/datum/export/weapon/powerglove
|
||||
cost = 100
|
||||
unit_name = "hydraulic glove"
|
||||
export_types = list(/obj/item/melee/powerfist)
|
||||
|
||||
/datum/export/weapon/sniper
|
||||
cost = 750
|
||||
unit_name = ".50 sniper"
|
||||
export_types = list(/obj/item/gun/ballistic/automatic/sniper_rifle/syndicate)
|
||||
|
||||
/datum/export/weapon/ebow
|
||||
cost = 600
|
||||
unit_name = "mini crossbow"
|
||||
export_types = list(/obj/item/gun/energy/kinetic_accelerator/crossbow)
|
||||
|
||||
/datum/export/weapon/m10mm
|
||||
cost = 10
|
||||
unit_name = "10mm magazine"
|
||||
export_types = list(/obj/item/ammo_box/magazine/m10mm)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/weapon/dj_a_bomb
|
||||
cost = 100
|
||||
unit_name = "40mm shell"
|
||||
export_types = list(/obj/item/ammo_casing/a40mm)
|
||||
|
||||
/datum/export/weapon/point50mags
|
||||
cost = 50
|
||||
unit_name = ".50 magazine"
|
||||
export_types = list(/obj/item/ammo_box/magazine/sniper_rounds)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/weapon/smg_mag
|
||||
cost = 45
|
||||
unit_name = "smg magazine"
|
||||
export_types = list(/obj/item/ammo_box/magazine/smgm45, /obj/item/ammo_box/magazine/m556)
|
||||
|
||||
/datum/export/weapon/l6sawammo
|
||||
cost = 60
|
||||
unit_name = "law 6 saw ammo box"
|
||||
export_types = list(/obj/item/ammo_box/magazine/mm195x129)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/weapon/rocket
|
||||
cost = 120
|
||||
unit_name = "rocket"
|
||||
export_types = list(/obj/item/ammo_casing/caseless/rocket)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/weapon/ninemmammo
|
||||
cost = 20
|
||||
unit_name = "9mm ammo magazine"
|
||||
export_types = list(/obj/item/ammo_box/magazine/pistolm9mm)
|
||||
|
||||
/datum/export/weapon/fletcher_ammo
|
||||
cost = 60
|
||||
unit_name = "illegal ammo magazines"
|
||||
export_types = list(/obj/item/ammo_box/magazine/flechette)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/weapon/dj_a_pizzabomb
|
||||
cost = -6000
|
||||
unit_name = "Repair Costs"
|
||||
export_types = list(/obj/item/pizzabox/bomb, /obj/item/sbeacondrop/bomb)
|
||||
|
||||
/datum/export/weapon/real_toolbox
|
||||
cost = 600
|
||||
unit_name = "golden toolbox"
|
||||
export_types = list(/obj/item/storage/toolbox/gold_real)
|
||||
|
||||
/datum/export/weapon/melee
|
||||
cost = 50
|
||||
unit_name = "unlisted weapon"
|
||||
export_types = list(/obj/item/melee)
|
||||
include_subtypes = TRUE
|
||||
|
||||
/datum/export/weapon/gun
|
||||
cost = 50
|
||||
unit_name = "unlisted weapon"
|
||||
export_types = list(/obj/item/gun)
|
||||
include_subtypes = TRUE
|
||||
@@ -0,0 +1,206 @@
|
||||
#define MAX_EMAG_ROCKETS 8
|
||||
#define BEACON_COST 5000
|
||||
#define SP_LINKED 1
|
||||
#define SP_READY 2
|
||||
#define SP_LAUNCH 3
|
||||
#define SP_UNLINK 4
|
||||
#define SP_UNREADY 5
|
||||
|
||||
/obj/machinery/computer/cargo/express
|
||||
name = "express supply console"
|
||||
desc = "This console allows the user to purchase a package \
|
||||
with 1/40th of the delivery time: made possible by NanoTrasen's new \"1500mm Orbital Railgun\".\
|
||||
All sales are near instantaneous - please choose carefully"
|
||||
icon_screen = "supply_express"
|
||||
circuit = /obj/item/circuitboard/computer/cargo/express
|
||||
blockade_warning = "Bluespace instability detected. Delivery impossible."
|
||||
req_access = list(ACCESS_QM)
|
||||
var/message
|
||||
var/printed_beacons = 0 //number of beacons printed. Used to determine beacon names.
|
||||
var/list/meme_pack_data
|
||||
var/obj/item/supplypod_beacon/beacon //the linked supplypod beacon
|
||||
var/area/landingzone = /area/quartermaster/storage //where we droppin boys
|
||||
var/podType = /obj/structure/closet/supplypod
|
||||
var/cooldown = 0 //cooldown to prevent printing supplypod beacon spam
|
||||
var/locked = TRUE //is the console locked? unlock with ID
|
||||
var/usingBeacon = FALSE //is the console in beacon mode? exists to let beacon know when a pod may come in
|
||||
|
||||
/obj/machinery/computer/cargo/express/Initialize()
|
||||
. = ..()
|
||||
packin_up()
|
||||
|
||||
/obj/machinery/computer/cargo/express/Destroy()
|
||||
if(beacon)
|
||||
beacon.unlink_console()
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/cargo/express/attackby(obj/item/W, mob/living/user, params)
|
||||
if((istype(W, /obj/item/card/id) || istype(W, /obj/item/pda)) && allowed(user))
|
||||
locked = !locked
|
||||
to_chat(user, "<span class='notice'>You [locked ? "lock" : "unlock"] the interface.</span>")
|
||||
return
|
||||
else if(istype(W, /obj/item/disk/cargo/bluespace_pod))
|
||||
podType = /obj/structure/closet/supplypod/bluespacepod
|
||||
to_chat(user, "<span class='notice'>You insert the disk into [src], allowing for advanced supply delivery vehicles.</span>")
|
||||
qdel(W)
|
||||
return TRUE
|
||||
else if(istype(W, /obj/item/supplypod_beacon))
|
||||
var/obj/item/supplypod_beacon/sb = W
|
||||
if (sb.express_console != src)
|
||||
sb.link_console(src, user)
|
||||
return TRUE
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] is already linked to [sb].</span>")
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/cargo/express/emag_act(mob/living/user)
|
||||
. = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] swipes a suspicious card through [src]!</span>",
|
||||
"<span class='notice'>You change the routing protocols, allowing the Supply Pod to land anywhere on the station.</span>")
|
||||
obj_flags |= EMAGGED
|
||||
// This also sets this on the circuit board
|
||||
var/obj/item/circuitboard/computer/cargo/board = circuit
|
||||
board.obj_flags |= EMAGGED
|
||||
packin_up()
|
||||
req_access = list()
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/cargo/express/proc/packin_up() // oh shit, I'm sorry
|
||||
meme_pack_data = list() // sorry for what?
|
||||
for(var/pack in SSshuttle.supply_packs) // our quartermaster taught us not to be ashamed of our supply packs
|
||||
var/datum/supply_pack/P = SSshuttle.supply_packs[pack] // specially since they're such a good price and all
|
||||
if(!meme_pack_data[P.group]) // yeah, I see that, your quartermaster gave you good advice
|
||||
meme_pack_data[P.group] = list( // it gets cheaper when I return it
|
||||
"name" = P.group, // mmhm
|
||||
"packs" = list() // sometimes, I return it so much, I rip the manifest
|
||||
) // see, my quartermaster taught me a few things too
|
||||
if((P.hidden) || (P.special)) // like, how not to rip the manifest
|
||||
continue// by using someone else's crate
|
||||
if(!(obj_flags & EMAGGED) && P.contraband) // will you show me?
|
||||
continue // i'd be right happy to
|
||||
meme_pack_data[P.group]["packs"] += list(list(
|
||||
"name" = P.name,
|
||||
"cost" = P.cost,
|
||||
"id" = pack,
|
||||
"desc" = P.desc || P.name // If there is a description, use it. Otherwise use the pack's name.
|
||||
))
|
||||
|
||||
/obj/machinery/computer/cargo/express/ui_interact(mob/living/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) // Remember to use the appropriate state.
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "cargo_express", name, 1000, 800, master_ui, state)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/computer/cargo/express/ui_data(mob/user)
|
||||
var/canBeacon = beacon && (isturf(beacon.loc) || ismob(beacon.loc))//is the beacon in a valid location?
|
||||
var/list/data = list()
|
||||
data["locked"] = locked//swipe an ID to unlock
|
||||
data["siliconUser"] = user.has_unlimited_silicon_privilege
|
||||
data["beaconzone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui
|
||||
data["usingBeacon"] = usingBeacon //is the mode set to deliver to the beacon or the cargobay?
|
||||
data["canBeacon"] = !usingBeacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location?
|
||||
data["canBuyBeacon"] = cooldown <= 0 && SSshuttle.points >= BEACON_COST
|
||||
data["beaconError"] = usingBeacon && !canBeacon ? "(BEACON ERROR)" : ""//changes button text to include an error alert if necessary
|
||||
data["hasBeacon"] = beacon != null//is there a linked beacon?
|
||||
data["beaconName"] = beacon ? beacon.name : "No Beacon Found"
|
||||
data["printMsg"] = cooldown > 0 ? "Print Beacon for [BEACON_COST] credits ([cooldown])" : "Print Beacon for [BEACON_COST] credits"//buttontext for printing beacons
|
||||
data["points"] = SSshuttle.points
|
||||
data["supplies"] = list()
|
||||
message = "Sales are near-instantaneous - please choose carefully."
|
||||
if(SSshuttle.supplyBlocked)
|
||||
message = blockade_warning
|
||||
if(usingBeacon && !beacon)
|
||||
message = "BEACON ERROR: BEACON MISSING"//beacon was destroyed
|
||||
else if (usingBeacon && !canBeacon)
|
||||
message = "BEACON ERROR: MUST BE EXPOSED"//beacon's loc/user's loc must be a turf
|
||||
if(obj_flags & EMAGGED)
|
||||
message = "(&!#@ERROR: ROUTING_#PROTOCOL MALF(*CT#ON. $UG%ESTE@ ACT#0N: !^/PULS3-%E)ET CIR*)ITB%ARD."
|
||||
data["message"] = message
|
||||
if(!meme_pack_data)
|
||||
packin_up()
|
||||
stack_trace("You didn't give the cargo tech good advice, and he ripped the manifest. As a result, there was no pack data for [src]")
|
||||
data["supplies"] = meme_pack_data
|
||||
if (cooldown > 0)//cooldown used for printing beacons
|
||||
cooldown--
|
||||
return data
|
||||
|
||||
/obj/machinery/computer/cargo/express/ui_act(action, params, datum/tgui/ui)
|
||||
switch(action)
|
||||
if("LZCargo")
|
||||
usingBeacon = FALSE
|
||||
if (beacon)
|
||||
beacon.update_status(SP_UNREADY) //ready light on beacon will turn off
|
||||
if("LZBeacon")
|
||||
usingBeacon = TRUE
|
||||
if (beacon)
|
||||
beacon.update_status(SP_READY) //turns on the beacon's ready light
|
||||
if("printBeacon")
|
||||
if (SSshuttle.points >= BEACON_COST)
|
||||
cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam
|
||||
var/obj/item/supplypod_beacon/C = new /obj/item/supplypod_beacon(drop_location())
|
||||
C.link_console(src, usr)//rather than in beacon's Initialize(), we can assign the computer to the beacon by reusing this proc)
|
||||
printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1
|
||||
beacon.name = "Supply Pod Beacon #[printed_beacons]"
|
||||
SSshuttle.points -= BEACON_COST
|
||||
|
||||
if("add")//Generate Supply Order first
|
||||
var/id = text2path(params["id"])
|
||||
var/datum/supply_pack/pack = SSshuttle.supply_packs[id]
|
||||
if(!istype(pack))
|
||||
return
|
||||
var/name = "*None Provided*"
|
||||
var/rank = "*None Provided*"
|
||||
var/ckey = usr.ckey
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/H = usr
|
||||
name = H.get_authentification_name()
|
||||
rank = H.get_assignment(hand_first = TRUE)
|
||||
else if(issilicon(usr))
|
||||
name = usr.real_name
|
||||
rank = "Silicon"
|
||||
var/reason = ""
|
||||
var/list/empty_turfs
|
||||
var/datum/supply_order/SO = new(pack, name, rank, ckey, reason)
|
||||
if(!(obj_flags & EMAGGED))
|
||||
if(SO.pack.cost <= SSshuttle.points)
|
||||
var/LZ
|
||||
if (istype(beacon) && usingBeacon)//prioritize beacons over landing in cargobay
|
||||
LZ = get_turf(beacon)
|
||||
beacon.update_status(SP_LAUNCH)
|
||||
else if (!usingBeacon)//find a suitable supplypod landing zone in cargobay
|
||||
landingzone = GLOB.areas_by_type[/area/quartermaster/storage]
|
||||
if (!landingzone)
|
||||
WARNING("[src] couldnt find a Quartermaster/Storage (aka cargobay) area on the station, and as such it has set the supplypod landingzone to the area it resides in.")
|
||||
landingzone = get_area(src)
|
||||
for(var/turf/open/floor/T in landingzone.contents)//uses default landing zone
|
||||
if(is_blocked_turf(T))
|
||||
continue
|
||||
LAZYADD(empty_turfs, T)
|
||||
CHECK_TICK
|
||||
if(empty_turfs && empty_turfs.len)
|
||||
LZ = pick(empty_turfs)
|
||||
if (SO.pack.cost <= SSshuttle.points && LZ)//we need to call the cost check again because of the CHECK_TICK call
|
||||
SSshuttle.points -= SO.pack.cost
|
||||
new /obj/effect/DPtarget(LZ, podType, SO)
|
||||
. = TRUE
|
||||
update_icon()
|
||||
else
|
||||
if(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS) <= SSshuttle.points) // bulk discount :^)
|
||||
landingzone = GLOB.areas_by_type[pick(GLOB.the_station_areas)] //override default landing zone
|
||||
for(var/turf/open/floor/T in landingzone.contents)
|
||||
if(is_blocked_turf(T))
|
||||
continue
|
||||
LAZYADD(empty_turfs, T)
|
||||
CHECK_TICK
|
||||
if(empty_turfs && empty_turfs.len)
|
||||
SSshuttle.points -= SO.pack.cost * (0.72*MAX_EMAG_ROCKETS)
|
||||
SO.generateRequisition(get_turf(src))
|
||||
for(var/i in 1 to MAX_EMAG_ROCKETS)
|
||||
var/LZ = pick(empty_turfs)
|
||||
LAZYREMOVE(empty_turfs, LZ)
|
||||
new /obj/effect/DPtarget(LZ, podType, SO)
|
||||
. = TRUE
|
||||
update_icon()
|
||||
CHECK_TICK
|
||||
@@ -0,0 +1,66 @@
|
||||
/mob/living/simple_animal/pet/gondola/gondolapod
|
||||
name = "gondola"
|
||||
real_name = "gondola"
|
||||
desc = "The silent walker. This one seems to be part of a delivery agency."
|
||||
response_help = "pets"
|
||||
response_disarm = "bops"
|
||||
response_harm = "kicks"
|
||||
faction = list("gondola")
|
||||
turns_per_move = 10
|
||||
icon = 'icons/mob/gondolapod.dmi'
|
||||
icon_state = "gondolapod"
|
||||
icon_living = "gondolapod"
|
||||
pixel_x = -16//2x2 sprite
|
||||
pixel_y = -5
|
||||
layer = TABLE_LAYER//so that deliveries dont appear underneath it
|
||||
loot = list(/obj/effect/decal/cleanable/blood/gibs, /obj/item/stack/sheet/animalhide/gondola = 2, /obj/item/reagent_containers/food/snacks/meat/slab/gondola = 2)
|
||||
//Gondolas aren't affected by cold.
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
maxbodytemp = 1500
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
del_on_death = TRUE
|
||||
var/opened = FALSE
|
||||
var/obj/structure/closet/supplypod/centcompod/linked_pod
|
||||
|
||||
/mob/living/simple_animal/pet/gondola/gondolapod/Initialize(mapload, pod)
|
||||
linked_pod = pod
|
||||
name = linked_pod.name
|
||||
. = ..()
|
||||
|
||||
/mob/living/simple_animal/pet/gondola/gondolapod/proc/update_icon()
|
||||
if(opened)
|
||||
icon_state = "gondolapod_open"
|
||||
else
|
||||
icon_state = "gondolapod"
|
||||
|
||||
/mob/living/simple_animal/pet/gondola/gondolapod/verb/deliver()
|
||||
set name = "Release Contents"
|
||||
set category = "Gondola"
|
||||
set desc = "Release any contents stored within your vast belly."
|
||||
linked_pod.open(src)
|
||||
|
||||
/mob/living/simple_animal/pet/gondola/gondolapod/verb/check()
|
||||
set name = "Count Contents"
|
||||
set category = "Gondola"
|
||||
set desc = "Take a deep look inside youself, and count up what's inside"
|
||||
var/total = contents.len
|
||||
if (total)
|
||||
to_chat(src, "<span class='notice'>You detect [total] object[total > 1 ? "s" : ""] within your incredibly vast belly.</span>")
|
||||
else
|
||||
to_chat(src, "<span class='notice'>A closer look inside yourself reveals... nothing.</span>")
|
||||
|
||||
/mob/living/simple_animal/pet/gondola/gondolapod/proc/setOpened()
|
||||
opened = TRUE
|
||||
update_icon()
|
||||
addtimer(CALLBACK(src, .proc/setClosed), 50)
|
||||
|
||||
/mob/living/simple_animal/pet/gondola/gondolapod/proc/setClosed()
|
||||
opened = FALSE
|
||||
update_icon()
|
||||
|
||||
/mob/living/simple_animal/pet/gondola/gondolapod/death()
|
||||
qdel(linked_pod) //Will cause the open() proc for the linked supplypod to be called with the "broken" parameter set to true, meaning that it will dump its contents on death
|
||||
qdel(src)
|
||||
..()
|
||||
@@ -0,0 +1,38 @@
|
||||
/datum/supply_pack
|
||||
var/name = "Crate"
|
||||
var/group = ""
|
||||
var/hidden = FALSE //Aka emag only
|
||||
var/contraband = FALSE //Hacking the console with a multitool
|
||||
var/cost = 700 // Minimum cost, or infinite points are possible.
|
||||
var/access = FALSE //What access does the Crate itself need?
|
||||
var/access_any = FALSE //Do we care about access?
|
||||
var/list/contains = null //What items are in the crate
|
||||
var/crate_name = "crate" //The crate that comes with each order
|
||||
var/desc = ""//no desc by default
|
||||
var/crate_type = /obj/structure/closet/crate //what kind of crate - Locked crates needed for access locked crates
|
||||
var/dangerous = FALSE // Should we message admins?
|
||||
var/special = FALSE //Event/Station Goals/Admin enabled packs
|
||||
var/special_enabled = FALSE
|
||||
var/DropPodOnly = FALSE //only usable by the Bluespace Drop Pod via the express cargo console
|
||||
var/admin_spawned = FALSE //Can only an admin spawn this crate?
|
||||
|
||||
/datum/supply_pack/proc/generate(atom/A)
|
||||
var/obj/structure/closet/crate/C = new crate_type(A)
|
||||
C.name = crate_name
|
||||
if(access)
|
||||
C.req_access = list(access)
|
||||
if(access_any)
|
||||
C.req_one_access = access_any
|
||||
|
||||
fill(C)
|
||||
|
||||
return C
|
||||
|
||||
/datum/supply_pack/proc/fill(obj/structure/closet/crate/C)
|
||||
if (admin_spawned)
|
||||
for(var/item in contains)
|
||||
var/atom/A = new item(C)
|
||||
A.flags_1 |= ADMIN_SPAWNED_1
|
||||
else
|
||||
for(var/item in contains)
|
||||
new item(C)
|
||||
Reference in New Issue
Block a user