Revert "PLASE"

This reverts commit 8af225e6e3.
This commit is contained in:
Fermi
2019-11-24 03:06:08 +00:00
parent aeb8606ce0
commit ba4fa1ef67
2145 changed files with 1387321 additions and 5257 deletions
+222
View File
@@ -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)
+194
View File
@@ -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
+137
View File
@@ -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)
+127
View File
@@ -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)
+65
View File
@@ -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)
+171
View File
@@ -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
+118
View File
@@ -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)
+54
View File
@@ -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)
+39
View File
@@ -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)
+48
View File
@@ -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())
+81
View File
@@ -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
+186
View File
@@ -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
+92
View File
@@ -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()
+511
View File
@@ -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
. = ..()
+228
View File
@@ -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)
+45
View File
@@ -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>")
+179
View File
@@ -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
+801
View File
@@ -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
+357
View File
@@ -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)
+94
View File
@@ -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)
+91
View File
@@ -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)
+102
View File
@@ -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)
+38
View File
@@ -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)
+159
View File
@@ -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)
+214
View File
@@ -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."
+357
View File
@@ -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
+206
View File
@@ -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
+66
View File
@@ -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)
..()
+38
View File
@@ -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)