Hard upstream sync (#6951)

* maps - none of our changes included yet i'll get them in after i finish up the rest of the sync

* sync part 1 - underscore folders in code

* controllers folder

* datums folder

* game folder

* cmon, work

* modules - admin to awaymissions

* cargo to events

* fields to lighting

* mapping > ruins

* rest of the code folder

* rest of the folders in the root directory

* DME

* fixes compiling errors. it compiles so it works

* readds map changes

* fixes dogborg module select

* fixes typo in moduleselect_alternate_icon filepath
This commit is contained in:
deathride58
2018-05-31 23:03:18 +00:00
committed by kevinz000
parent b6e608cb4c
commit 2f9e3e403d
395 changed files with 134016 additions and 26287 deletions
+270
View File
@@ -0,0 +1,270 @@
/datum/bounty/item/assistant/strange_object
name = "Strange Object"
description = "Nanotrasen has taken an interest in strange objects. Find one in maint, and ship it off to CentCom right away."
reward = 1200
wanted_types = list(/obj/item/relic)
/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 = 1080 // 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 a wasteful. Ship a skateboard to CentCom to speed operations up."
reward = 900 // 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 = 1300
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 = 2000
required_count = 3
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 = 2000
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 = 2000
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/clown_box
name = "Clown Box"
description = "The universe needs laughter. Stamp cardboard with a clown stamp and ship it out."
reward = 1500
wanted_types = list(/obj/item/storage/box/clown)
/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 = 1200
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 = 2000
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 = 2500
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 = 3000
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 = 3000
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 = 2500
required_count = 5
wanted_types = list(/obj/item/storage/briefcase)
/datum/bounty/item/assistant/sunglasses
name = "Sunglasses"
description = "A famous blues duo is passing through the sector, but they've lost their shades and they can't perform. Ship new sunglasses to CentCom to rectify this."
reward = 3000
required_count = 2
wanted_types = list(/obj/item/clothing/glasses/sunglasses)
/datum/bounty/item/assistant/gondola_hide
name = "Gondola Hide"
description = "Central Command has recently learned of strange creatures called Gondolas. If you catch one, ship its hide back to CentCom."
reward = 5000
wanted_types = list(/obj/item/stack/sheet/animalhide/gondola)
/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 = 1500
wanted_types = list(/obj/item/stack/sheet/animalhide/monkey)
/datum/bounty/item/assistant/heart
name = "Heart"
description = "Commander Johnson is in critical condition after suffering a 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/assistant/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 = 1
wanted_types = list(/obj/item/organ/lungs)
/datum/bounty/item/assistant/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 = 3000
wanted_types = list(/obj/item/organ/appendix)
/datum/bounty/item/assistant/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/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 = 1500
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 = 1500
required_count = 5
wanted_types = list(/obj/structure/chair/comfy)
/datum/bounty/item/assistant/revolver
name = "Revolver"
description = "Captain Johann of station 12 has challenged Captain Vic of station 11 to a duel. He's asked for help securing an appropriate revolver to use."
reward = 2000
wanted_types = list(/obj/item/gun/ballistic/revolver)
/datum/bounty/item/assistant/hand_tele
name = "Hand Tele"
description = "Central Command has come up with a genius idea: Why not teleport cargo rather than ship it? Send over a hand tele, receive payment, then wait 6-8 years while they deliberate."
reward = 2000
wanted_types = list(/obj/item/hand_tele)
/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 = 4000
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 = 500
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/handcuffs
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/plasma_tank
name = "Full Tank of Plasma"
description = "Station 12 has requested supplies to set up a singularity engine. In particular, they request 28 moles of plasma."
reward = 2500
wanted_types = list(/obj/item/tank)
var/moles_required = 20 // A full tank is 28 moles, but CentCom ignores that fact.
/datum/bounty/item/assistant/plasma_tank/applies_to(obj/O)
if(!..())
return FALSE
var/obj/item/tank/T = O
if(!T.air_contents.gases[/datum/gas/plasma])
return FALSE
return T.air_contents.gases[/datum/gas/plasma][MOLES] >= moles_required
/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/chef/action_figures
name = "Action Figures"
description = "The vice president's son saw an ad for action figures on the telescreen and now he won't shut up about them. Ship some to ease his complaints."
reward = 4000
required_count = 5
wanted_types = list(/obj/item/toy/figure)
+138
View File
@@ -0,0 +1,138 @@
/datum/bounty/item/chef/birthday_cake
name = "Birthday Cake"
description = "Nanotrasen's birthday is coming up! Ship them a birthday cake to celebrate!"
reward = 4000
wanted_types = list(/obj/item/reagent_containers/food/snacks/store/cake/birthday, /obj/item/reagent_containers/food/snacks/cakeslice/birthday)
/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 = 3000
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/soup)
/datum/bounty/item/chef/popcorn
name = "Popcorn Bags"
description = "Upper management wants to host a movie night. Ship bags of popcorn for the occasion."
reward = 3000
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/popcorn)
/datum/bounty/item/chef/onionrings
name = "Onion Rings"
description = "Nanotrasen is remembering Saturn day. Ship onion rings to show the station's support."
reward = 3000
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/onionrings)
/datum/bounty/item/chef/icecreamsandwich
name = "Ice Cream Sandwiches"
description = "Upper management has been screaming non-stop for ice cream. Please send some."
reward = 4000
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 = 3000
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/salad)
/datum/bounty/item/chef/carrotfries
name = "Carrot Fries"
description = "Night sight can mean life or death! A shipment of carrot fries is the order."
reward = 3500
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/carrotfries)
/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 = 12000
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 = 8000
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 = 8000
wanted_types = list(/obj/item/reagent_containers/food/snacks/hotdog)
/datum/bounty/item/chef/lemon
name = "Lemons"
description = "A commander claims he can turn lemons into money. Ship him a few and he'll deposit the money into the station's account."
reward = 4444
required_count = 10
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/citrus/lemon)
/datum/bounty/item/chef/eggplantparm
name = "Eggplant Parmigianas"
description = "A famous singer will be arriving at CentCom, and their contract demands that they only be served Eggplant Parmigiana. Ship some, please!"
reward = 3500
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/eggplantparm)
/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 = 8000
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 = 3500
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 = 5000
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 = 5000
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 = 4000
required_count = 6
wanted_types = list(/obj/item/reagent_containers/food/snacks/nugget)
+35
View File
@@ -0,0 +1,35 @@
/datum/bounty/item
var/required_count = 1
var/shipped_count = 0
var/list/wanted_types // Types accepted for the bounty.
var/include_subtypes = TRUE // Set to FALSE to make the datum apply only to a strict type.
var/list/exclude_types // Types excluded.
/datum/bounty/item/New()
..()
wanted_types = typecacheof(wanted_types)
exclude_types = typecacheof(exclude_types)
/datum/bounty/item/completion_string()
return {"[shipped_count]/[required_count]"}
/datum/bounty/item/can_claim()
return ..() && shipped_count >= required_count
/datum/bounty/item/applies_to(obj/O)
if(!include_subtypes && !(O.type in wanted_types))
return FALSE
if(include_subtypes && (!is_type_in_typecache(O, wanted_types) || is_type_in_typecache(O, exclude_types)))
return FALSE
if(O.flags_1 & HOLOGRAM_1)
return FALSE
return shipped_count < required_count
/datum/bounty/item/ship(obj/O)
if(!applies_to(O))
return
shipped_count += 1
/datum/bounty/item/compatible_with(datum/other_bounty)
return type != other_bounty.type
+40
View File
@@ -0,0 +1,40 @@
/datum/bounty/item/mech/New()
..()
description = "Upper management has requested one [name] mech be sent as soon as possible. Ship it to receive a large payment."
/datum/bounty/item/mech/ship(obj/O)
if(!applies_to(O))
return
if(istype(O, /obj/mecha))
var/obj/mecha/M = O
M.wreckage = null // So the mech doesn't explode.
..()
/datum/bounty/item/mech/mark_high_priority(scale_reward)
return ..(max(scale_reward * 0.7, 1.2))
/datum/bounty/item/mech/ripley
name = "APLU \"Ripley\""
reward = 13000
wanted_types = list(/obj/mecha/working/ripley)
/datum/bounty/item/mech/odysseus
name = "Odysseus"
reward = 11000
wanted_types = list(/obj/mecha/medical/odysseus)
/datum/bounty/item/mech/gygax
name = "Gygax"
reward = 28000
wanted_types = list(/obj/mecha/combat/gygax)
/datum/bounty/item/mech/durand
name = "Durand"
reward = 20000
wanted_types = list(/obj/mecha/combat/durand)
/datum/bounty/item/mech/phazon
name = "Phazon"
reward = 50000
wanted_types = list(/obj/mecha/combat/phazon)
+172
View File
@@ -0,0 +1,172 @@
/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/bluecherryshake,\
/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) * 500
/datum/bounty/reagent/chemical
name = "Chemical"
reward = 4000
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
+72
View File
@@ -0,0 +1,72 @@
/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 = 10000
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 = 10000
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 = 10000
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 = 10000
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 = 10000
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 = 10000
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 = 10000
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 = 15000
wanted_types = list(/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 = 10000
wanted_types = list(/obj/item/janiupgrade)
/datum/bounty/item/science/flightsuit
name = "Flight Suit"
description = "According to all known laws of physics, flight suits are cool. CentCom will pay at a premium for them, so get shipping!"
reward = 30000
wanted_types = list(/obj/item/clothing/suit/space/hardsuit/flightsuit)
/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 = 10000
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 = 10000
wanted_types = list(/obj/item/gun/energy/e_gun/nuclear)
+62
View File
@@ -0,0 +1,62 @@
/datum/bounty/item/security/headset
name = "Security Headset"
description = "Nanotrasen wants to ensure that their encryption is working correctly. Ship them a security headset so that they can check."
reward = 800
wanted_types = list(/obj/item/radio/headset/headset_sec, /obj/item/radio/headset/heads/hos)
/datum/bounty/item/security/securitybelt
name = "Security Belt"
description = "CentCom is having difficulties with their security belts. Ship one from the station to receive compensation."
reward = 800
wanted_types = list(/obj/item/storage/belt/security)
/datum/bounty/item/security/sechuds
name = "Security HUDSunglasses"
description = "CentCom screwed up and ordered the wrong type of security sunglasses. They request the station ship some of theirs."
reward = 800
wanted_types = list(/obj/item/clothing/glasses/hud/security/sunglasses)
/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 = 5000
required_count = 2
wanted_types = list(/obj/item/gun/ballistic/shotgun/riot)
/datum/bounty/item/security/pinpointer
name = "Nuclear Pinpointer"
description = "There's a teeny-tiny itty-bitty chance CentCom may have lost a nuke disk. Can the station spare a pinpointer to help out?"
reward = 1500
wanted_types = list(/obj/item/pinpointer/nuke)
/datum/bounty/item/security/captains_spare
name = "Captain's Spare"
description = "Captain Bart of Station 12 has forgotten his ID! Ship him your station's spare, would you?"
reward = 1500
wanted_types = list(/obj/item/card/id/captains_spare)
/datum/bounty/item/security/hardsuit
name = "Security Hardsuit"
description = "Space pirates are heading towards CentCom! Quick! Ship a security hardsuit to aid the fight!"
reward = 2000
wanted_types = list(/obj/item/clothing/suit/space/hardsuit/security)
/datum/bounty/item/security/krav_maga
name = "Krav Maga Gloves"
description = "Chef Howerwitz of CentCom is trying to take a kung-fu Pizza out of the oven, but his mitts aren't up to the task. Ship them a pair of Krav Maga gloves to do the job right."
reward = 2000
wanted_types = list(/obj/item/clothing/gloves/krav_maga)
/datum/bounty/item/security/recharger
name = "Rechargers"
description = "Nanotrasen military academy is conducting marksmanship exercises. They request that rechargers be shipped."
reward = 2000
required_count = 3
wanted_types = list(/obj/machinery/recharger)
/datum/bounty/item/security/sabre
name = "Officer's Sabre"
description = "A 3-hour LARP session will be held at CentCom in the upcoming months. A shipped officer's sabre would make a good prop."
reward = 2500
wanted_types = list(/obj/item/melee/sabre)
+39
View File
@@ -0,0 +1,39 @@
/datum/bounty/item/slime
reward = 3000
/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) * 500
/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)
+41
View File
@@ -0,0 +1,41 @@
/datum/bounty/item/alien_organs
name = "Alien Organs"
description = "Nanotrasen is interested in studying Xenomorph biology. Ship a set of organs to be thouroughly compensated."
reward = 25000
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/more_bounties
name = "More Bounties"
description = "Complete enough bounties and CentCom will issue new ones!"
reward = 3 // number of bounties
var/required_bounties = 5
/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 = 5000
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) * 500
/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 = "transmittable"
/datum/bounty/virus/transmit/accepts_virus(V)
var/datum/disease/advance/A = V
return A.totalTransmittable() == stat_value
+148
View File
@@ -0,0 +1,148 @@
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, 9))
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
// Called lazily at startup to populate GLOB.bounties_list with random bounties.
/proc/setup_bounties()
for(var/i = 0; i < 3; ++i)
var/subtype = pick(subtypesof(/datum/bounty/item/assistant))
try_add_bounty(new subtype)
for(var/i = 0; i < 1; ++i)
var/list/subtype = pick(subtypesof(/datum/bounty/item/mech))
try_add_bounty(new subtype)
for(var/i = 0; i < 2; ++i)
var/list/subtype = pick(subtypesof(/datum/bounty/item/chef))
try_add_bounty(new subtype)
for(var/i = 0; i < 1; ++i)
var/list/subtype = pick(subtypesof(/datum/bounty/item/security))
try_add_bounty(new subtype)
try_add_bounty(new /datum/bounty/reagent/simple_drink)
try_add_bounty(new /datum/bounty/reagent/complex_drink)
try_add_bounty(new /datum/bounty/reagent/chemical)
for(var/i = 0; i < 1; ++i)
var/list/subtype = pick(subtypesof(/datum/bounty/virus))
try_add_bounty(new subtype)
var/datum/bounty/B = pick(GLOB.bounties_list)
B.mark_high_priority()
// Generate these last so they can't be high priority.
try_add_bounty(new /datum/bounty/item/alien_organs)
try_add_bounty(new /datum/bounty/item/syndicate_documents)
try_add_bounty(new /datum/bounty/more_bounties)
/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
+94
View File
@@ -0,0 +1,94 @@
#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>"
info += "<ul><li>Reward: [B.reward_string()]</li>"
info += "<li>Completed: [B.completion_string()]</li></ul>"
/obj/machinery/computer/bounty/ui_interact(mob/user)
. = ..()
if(!GLOB.bounties_list.len)
setup_bounties()
var/dat = ""
dat += "<a href='?src=[REF(src)];refresh=1'>Refresh</a>"
dat += "<a href='?src=[REF(src)];refresh=1;choice=Print'>Print Paper</a>"
dat += "<p>Credits: <b>[SSshuttle.points]</b></p>"
dat += {"<table style="text-align:center;" border="1" cellspacing="0" width="100%">"}
dat += "<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)
var/background
if(B.can_claim())
background = "'background-color:#4F7529;'"
else if(B.claimed)
background = "'background-color:#294675;'"
else
background = "'background-color:#990000;'"
dat += "<tr style=[background]>"
if(B.high_priority)
dat += text("<td><b>[]</b></td>", B.name)
dat += text("<td><b>High Priority:</b> []</td>", B.description)
dat += text("<td><b>[]</b></td>", B.reward_string())
else
dat += text("<td>[]</td>", B.name)
dat += text("<td>[]</td>", B.description)
dat += text("<td>[]</td>", B.reward_string())
dat += text("<td>[]</td>", B.completion_string())
if(B.can_claim())
dat += text("<td><A href='?src=[REF(src)];refresh=1;choice=Claim;d_rec=[REF(B)]'>Claim</a></td>")
else if(B.claimed)
dat += text("<td>Claimed</td>")
else
dat += text("<td>Unclaimed</td>")
dat += "</tr>"
dat += "</table>"
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()
+3 -2
View File
@@ -1,6 +1,6 @@
/obj/item/export_scanner
name = "export scanner"
desc = "A device used to check objects against Nanotrasen exports database."
desc = "A device used to check objects against Nanotrasen exports and bounty database."
icon = 'icons/obj/device.dmi'
icon_state = "export_scanner"
item_state = "radio"
@@ -31,8 +31,9 @@
// Before you fix it:
// yes, checking manifests is a part of intended functionality.
var/price = export_item_and_contents(O, cargo_console.contraband, (cargo_console.obj_flags & EMAGGED), dry_run=TRUE)
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>")
+13 -59
View File
@@ -1,8 +1,5 @@
// Armor, gloves, space suits - it all goes here
/datum/export/gear
// Security gear
/datum/export/gear/sec_helmet
cost = 100
unit_name = "helmet"
@@ -12,37 +9,13 @@
cost = 100
unit_name = "armor vest"
export_types = list(/obj/item/clothing/suit/armor/vest)
include_subtypes = FALSE
/datum/export/gear/riot_helmet
cost = 250
unit_name = "riot helmet"
export_types = list(/obj/item/clothing/head/helmet/riot)
/datum/export/gear/riot_armor
cost = 250
unit_name = "riot armor suit"
export_types = list(/obj/item/clothing/suit/armor/riot)
/datum/export/gear/bulletproof_armor
cost = 250
unit_name = "bulletproof armor vest"
export_types = list(/obj/item/clothing/suit/armor/bulletproof)
/datum/export/gear/reflector_armor
cost = 650
unit_name = "reflector armor vest"
export_types = list(/obj/item/clothing/suit/armor/laserproof)
/datum/export/gear/riot_shield
cost = 400
cost = 100
unit_name = "riot shield"
export_types = list(/obj/item/shield/riot)
// Masks
/datum/export/gear/mask/breath
cost = 2
unit_name = "breath mask"
@@ -55,47 +28,30 @@
include_subtypes = FALSE
// EVA gear
/datum/export/gear/space
/datum/export/gear/space/helmet
cost = 75
unit_name = "space helmet"
export_types = list(/obj/item/clothing/head/helmet/space, /obj/item/clothing/head/helmet/space/eva, /obj/item/clothing/head/helmet/space/nasavoid)
include_subtypes = FALSE
/datum/export/gear/space/helmet
cost = 500
unit_name = "space helmet"
export_types = list(/obj/item/clothing/head/helmet/space, /obj/item/clothing/head/helmet/space/eva)
/datum/export/gear/space/suit
cost = 600
cost = 150
unit_name = "space suit"
export_types = list(/obj/item/clothing/suit/space, /obj/item/clothing/suit/space/eva)
/datum/export/gear/space/voidhelmet
cost = 550
unit_name = "void helmet"
export_types = list(/obj/item/clothing/head/helmet/space/nasavoid)
/datum/export/gear/space/voidsuit
cost = 650
unit_name = "void suit"
export_types = list(/obj/item/clothing/suit/space/nasavoid)
export_types = list(/obj/item/clothing/suit/space, /obj/item/clothing/suit/space/eva, /obj/item/clothing/suit/space/nasavoid)
include_subtypes = FALSE
/datum/export/gear/space/syndiehelmet
cost = 1000
cost = 150
unit_name = "Syndicate space helmet"
export_types = list(/obj/item/clothing/head/helmet/space/syndicate)
include_subtypes = TRUE
/datum/export/gear/space/syndiesuit
cost = 1500
cost = 300
unit_name = "Syndicate space suit"
export_types = list(/obj/item/clothing/suit/space/syndicate)
include_subtypes = TRUE
// Radsuits
/datum/export/gear/radhelmet
cost = 50
unit_name = "radsuit hood"
@@ -106,7 +62,6 @@
unit_name = "radsuit"
export_types = list(/obj/item/clothing/suit/radiation)
// Biosuits
/datum/export/gear/biohood
cost = 50
unit_name = "biosuit hood"
@@ -117,13 +72,12 @@
unit_name = "biosuit"
export_types = list(/obj/item/clothing/suit/bio_suit)
// Bombsuits
/datum/export/gear/bombhelmet
cost = 100
cost = 50
unit_name = "bomb suit hood"
export_types = list(/obj/item/clothing/head/bomb_hood)
/datum/export/gear/bombsuit
cost = 300
cost = 100
unit_name = "bomb suit"
export_types = list(/obj/item/clothing/suit/bomb_suit)
export_types = list(/obj/item/clothing/suit/bomb_suit)
+10 -87
View File
@@ -1,6 +1,3 @@
// Large objects that don't fit in crates, but must be sellable anyway.
// Crates, boxes, lockers.
/datum/export/large/crate
cost = 500
k_elasticity = 0
@@ -29,9 +26,11 @@
export_types = list(/obj/structure/closet/crate/wooden)
exclude_types = list()
/datum/export/large/crate/coffin
cost = 250//50 wooden crates cost 2000 points, and you can make 10 coffins in seconds with those planks. Each coffin selling for 250 means you can make a net gain of 500 points for wasting your time making coffins.
unit_name = "coffin"
export_types = list(/obj/structure/closet/crate/coffin)
// Reagent dispensers.
/datum/export/large/reagent_dispenser
cost = 100 // +0-400 depending on amount of reagents left
var/contents_cost = 400
@@ -58,19 +57,18 @@
// Heavy engineering equipment. Singulo/Tesla parts mostly.
/datum/export/large/emitter
cost = 400
cost = 200
unit_name = "emitter"
export_types = list(/obj/machinery/power/emitter)
/datum/export/large/field_generator
cost = 400
cost = 200
unit_name = "field generator"
export_types = list(/obj/machinery/field/generator)
/datum/export/large/collector
cost = 600
cost = 200
unit_name = "collector"
export_types = list(/obj/machinery/power/rad_collector)
@@ -94,89 +92,14 @@
unit_name = "supermatter shard"
export_types = list(/obj/machinery/power/supermatter_crystal/shard)
// Misc
/datum/export/large/iv
cost = 300
cost = 50
unit_name = "iv drip"
export_types = list(/obj/machinery/iv_drip)
/datum/export/large/barrier
cost = 100
cost = 25
unit_name = "security barrier"
export_types = list(/obj/item/grenade/barrier, /obj/structure/barricade/security)
//Mecha
/datum/export/large/mech
export_types = list(/obj/mecha)
var/sellable
/datum/export/large/mech/applies_to(obj/O)
if(!..())
return FALSE
var/obj/mecha/ME = O
ME.wreckage = null // So the mech doesn't blow up in the cargo shuttle
if(sellable)
return TRUE
/datum/export/large/mech/sellable
export_types = list()
sellable = TRUE
/datum/export/large/mech/sellable/ripley
cost = 7500 //boards cost 2500 and takes another 1566 worth of materials (glass, metal, plaseel) to build + significant labor
unit_name = "APLU \"Ripley\""
export_types = list(/obj/mecha/working/ripley)
exclude_types = list(/obj/mecha/working/ripley/firefighter)
/datum/export/large/mech/sellable/firefighter
cost = 9000 //same as a ripley but takes 10 more plasteel and 5 less metal
unit_name = "APLU \"Firefighter\""
export_types = list(/obj/mecha/working/ripley/firefighter)
/datum/export/large/mech/sellable/odysseus
cost = 6000 // 1540 of material + 2000 price boards + labor
unit_name = "odysseus"
export_types = list(/obj/mecha/medical/odysseus)
/datum/export/large/mech/sellable/gygax
cost = 25000 // The material is worth 22631 alone. Not as big of a premium as one would expect, since R&D would have provided upgrades by then.
unit_name = "gygax"
export_types = list(/obj/mecha/combat/gygax)
exclude_types = list(/obj/mecha/combat/gygax/dark)
/datum/export/large/mech/sellable/honkmech
cost = 80000 // The bananium alone is worth around 64887 credits
unit_name = "H.O.N.K"
message = "- HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONK HONKHONKHONKHONK"
export_types = list(/obj/mecha/combat/honker)
/datum/export/large/mech/sellable/durand
cost = 12000 // 7586 worth of material. That's less than a gygax. Players will be disappointed by the durand's comparative lack of worth but oh well. Still a large premium because this requires significant cooperation between R&D, robotics, and cargo.
unit_name = "durand"
export_types = list(/obj/mecha/combat/durand)
/datum/export/large/mech/sellable/phazon
cost = 50000 // 15767 material + anomaly core. Fuck it, if you're willing to try selling one of these you should get BIG FUCKING MONEY
unit_name = "phazon"
export_types = list(/obj/mecha/combat/phazon)
/datum/export/large/mech/sellable/syndiegygax
cost = 50000 // You somehow stole a nuke op's gygax and sold it to nanotrasen. Go you.
unit_name = "captured syndicate gygax"
export_types = list(/obj/mecha/combat/gygax/dark)
/datum/export/large/mech/sellable/syndiegygax/syndie
cost = 25000 // You somehow stole a nuke op's gygax and sold it back to the syndicate. Why would you do this?
unit_name = "gygax"
emagged = TRUE
/datum/export/large/mech/sellable/mauler
cost = 87500 // Whoa, momma.
unit_name = "captured mauler"
export_types = list(/obj/mecha/combat/marauder/mauler)
/datum/export/large/mech/sellable/mauler/syndie
cost = 43750 // Just like the mauler is worth 1.75x the telecrystals compared to the gygax, the price reflects this
unit_name = "mauler"
emagged = TRUE
+11 -19
View File
@@ -29,65 +29,57 @@
// Materials. Nothing but plasma is really worth selling. Better leave it all to RnD and sell some plasma instead.
// Bananium. Exporting it makes the clown cry. Priceless.
/datum/export/material/bananium
cost = 5000
cost = 1000
material_id = MAT_BANANIUM
message = "cm3 of bananium"
// Diamonds. Rare and expensive.
/datum/export/material/diamond
cost = 2500
cost = 500
material_id = MAT_DIAMOND
message = "cm3 of diamonds"
// Plasma. The oil of 26 century. The reason why you are here.
/datum/export/material/plasma
cost = 300
cost = 200
k_elasticity = 0
material_id = MAT_PLASMA
message = "cm3 of plasma"
// Uranium. Still useful for both power generation and nuclear annihilation.
/datum/export/material/uranium
cost = 400
cost = 100
material_id = MAT_URANIUM
message = "cm3 of uranium"
// Gold. Used in electronics and corrosion-resistant plating.
/datum/export/material/gold
cost = 250
cost = 125
material_id = MAT_GOLD
message = "cm3 of gold"
// Silver.
/datum/export/material/silver
cost = 100
cost = 50
material_id = MAT_SILVER
message = "cm3 of silver"
// Titanium.
/datum/export/material/titanium
cost = 250
cost = 125
material_id = MAT_TITANIUM
message = "cm3 of titanium"
// Plastitanium.
/datum/export/material/plastitanium
cost = 550
material_id = MAT_TITANIUM // code can only check for one material_id; plastitanium is half plasma, half titanium, so ((250 x 250) + (250 x 500)) / 250
cost = 325 // 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"
// Metal. Common building material.
/datum/export/material/metal
cost = 5
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)
// Glass. Common building material.
/datum/export/material/glass
cost = 5
message = "cm3 of glass"
material_id = MAT_GLASS
export_types = list(/obj/item/stack/sheet/glass, /obj/item/stack/ore,
+1 -1
View File
@@ -1,5 +1,5 @@
/datum/export/seed
cost = 100 // Gets multiplied by potency
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)
+15 -47
View File
@@ -1,7 +1,3 @@
//
// Sheet Exports
//
/datum/export/stack
unit_name = "sheet"
@@ -11,106 +7,87 @@
return S.amount
return 0
// Hides
// Leather, skin and other farming by-products.
/datum/export/stack/skin
unit_name = ""
// Monkey hide. Cheap.
/datum/export/stack/skin/monkey
cost = 150
cost = 50
unit_name = "monkey hide"
export_types = list(/obj/item/stack/sheet/animalhide/monkey)
// Human skin. Illegal
/datum/export/stack/skin/human
cost = 2000
cost = 100
contraband = TRUE
unit_name = "piece"
message = "of human skin"
export_types = list(/obj/item/stack/sheet/animalhide/human)
// Goliath hide. Expensive.
/datum/export/stack/skin/goliath_hide
cost = 2500
cost = 200
unit_name = "goliath hide"
export_types = list(/obj/item/stack/sheet/animalhide/goliath_hide)
// Cat hide. Just in case Runtime is catsploding again.
/datum/export/stack/skin/cat
cost = 2000
cost = 150
contraband = TRUE
unit_name = "cat hide"
export_types = list(/obj/item/stack/sheet/animalhide/cat)
// Corgi hide. You monster.
/datum/export/stack/skin/corgi
cost = 2500
cost = 200
contraband = TRUE
unit_name = "corgi hide"
export_types = list(/obj/item/stack/sheet/animalhide/corgi)
// Lizard hide. Very expensive.
/datum/export/stack/skin/lizard
cost = 5000
cost = 150
unit_name = "lizard hide"
export_types = list(/obj/item/stack/sheet/animalhide/lizard)
// Gondola hide. Mindbogglingly expensive.
/datum/export/stack/skin/gondola
cost = 10000
cost = 500
unit_name = "gondola hide"
export_types = list(/obj/item/stack/sheet/animalhide/gondola)
// Alien hide. Extremely expensive.
/datum/export/stack/skin/xeno
cost = 3000
cost = 500
unit_name = "alien hide"
export_types = list(/obj/item/stack/sheet/animalhide/xeno)
// Common materials.
// For base materials, see materials.dm
// Plasteel. Lightweight, strong and contains some plasma too.
/datum/export/stack/plasteel
cost = 305 // 2000u of plasma + 2000u of metal.
cost = 155 // 2000u of plasma + 2000u of metal.
message = "of plasteel"
export_types = list(/obj/item/stack/sheet/plasteel)
// Reinforced Glass. Common building material. 1 glass + 0.5 metal, cost is rounded up.
// 1 glass + 0.5 metal, cost is rounded up.
/datum/export/stack/rglass
cost = 8
message = "of reinforced glass"
export_types = list(/obj/item/stack/sheet/rglass)
// Bluespace Polycrystals. Uncommon.
/datum/export/stack/bscrystal
cost = 750
cost = 300
message = "of bluespace crystals"
export_types = list(/obj/item/stack/sheet/bluespace_crystal)
// Wood. Quite expensive in the grim and dark 26 century.
/datum/export/stack/wood
cost = 50
cost = 30
unit_name = "wood plank"
export_types = list(/obj/item/stack/sheet/mineral/wood)
// Cardboard. Cheap.
/datum/export/stack/cardboard
cost = 2
message = "of cardboard"
export_types = list(/obj/item/stack/sheet/cardboard)
// Sandstone. Literally dirt cheap.
/datum/export/stack/sandstone
cost = 1
unit_name = "block"
message = "of sandstone"
export_types = list(/obj/item/stack/sheet/mineral/sandstone)
// Cable.
/datum/export/stack/cable
cost = 0.2
unit_name = "cable piece"
@@ -118,23 +95,14 @@
// Weird Stuff
// Alien Alloy. Like plasteel, but better.
// Major players would pay a lot to get some, so you can get a lot of money from producing and selling those.
// Just don't forget to fire all your production staff before the end of month.
/datum/export/stack/abductor
cost = 5000
cost = 1000
message = "of alien alloy"
export_types = list(/obj/item/stack/sheet/mineral/abductor)
// Adamantine. Does not occur naurally.
/datum/export/stack/adamantine
unit_name = "bar"
cost = 7500
cost = 500
message = "of adamantine"
export_types = list(/obj/item/stack/sheet/mineral/adamantine)
// Mythril. Does not occur naurally.
/datum/export/stack/mythril
cost = 15000
message = "of mythril"
export_types = list(/obj/item/stack/sheet/mineral/mythril)
+3 -10
View File
@@ -1,5 +1,3 @@
// Various tools and handheld engineering devices.
/datum/export/toolbox
cost = 4
unit_name = "toolbox"
@@ -34,7 +32,6 @@
export_types = list(/obj/item/wirecutters)
// Welding tools
/datum/export/weldingtool
cost = 5
unit_name = "welding tool"
@@ -52,7 +49,6 @@
export_types = list(/obj/item/weldingtool/largetank, /obj/item/weldingtool/hugetank)
// Fire extinguishers
/datum/export/extinguisher
cost = 15
unit_name = "fire extinguisher"
@@ -65,7 +61,6 @@
export_types = list(/obj/item/extinguisher/mini)
// Flashlights
/datum/export/flashlight
cost = 5
unit_name = "flashlight"
@@ -83,7 +78,6 @@
export_types = list(/obj/item/flashlight/seclite)
// Analyzers and Scanners
/datum/export/analyzer
cost = 5
unit_name = "analyzer"
@@ -102,18 +96,17 @@
exclude_types = list(/obj/item/radio/mech)
// High-tech tools.
/datum/export/rcd
cost = 100 // 15 metal -> 75 credits, +25 credits for production
cost = 100
unit_name = "rapid construction device"
export_types = list(/obj/item/construction/rcd)
/datum/export/rcd_ammo
cost = 60 // 6 metal, 4 glass -> 50 credits, +10 credits
cost = 60
unit_name = "compressed matter cardridge"
export_types = list(/obj/item/rcd_ammo)
/datum/export/rpd
cost = 350 // 37.5 metal, 18.75 glass -> 281.25 credits, + some
cost = 100
unit_name = "rapid piping device"
export_types = list(/obj/item/pipe_dispenser)
+10 -11
View File
@@ -11,18 +11,18 @@
include_subtypes = TRUE
/datum/export/weapon/knife
cost = 750
cost = 100
unit_name = "combat knife"
export_types = list(/obj/item/kitchen/knife/combat)
/datum/export/weapon/taser
cost = 250
cost = 200
unit_name = "advanced taser"
export_types = list(/obj/item/gun/energy/e_gun/advtaser)
/datum/export/weapon/laser
cost = 250
cost = 200
unit_name = "laser gun"
export_types = list(/obj/item/gun/energy/laser)
@@ -32,35 +32,34 @@
export_types = list(/obj/item/gun/energy/disabler)
/datum/export/weapon/energy_gun
cost = 900
cost = 300
unit_name = "energy gun"
export_types = list(/obj/item/gun/energy/e_gun)
/datum/export/weapon/wt550
cost = 1400
cost = 300
unit_name = "WT-550 automatic rifle"
export_types = list(/obj/item/gun/ballistic/automatic/wt550)
/datum/export/weapon/shotgun
cost = 350
cost = 300
unit_name = "combat shotgun"
export_types = list(/obj/item/gun/ballistic/shotgun/automatic/combat)
/datum/export/weapon/flashbang
cost = 15
cost = 5
unit_name = "flashbang grenade"
export_types = list(/obj/item/grenade/flashbang)
/datum/export/weapon/teargas
cost = 15
cost = 5
unit_name = "tear gas grenade"
export_types = list(/obj/item/grenade/chem_grenade/teargas)
/datum/export/weapon/flash
cost = 10
cost = 5
unit_name = "handheld flash"
export_types = list(/obj/item/assembly/flash)
include_subtypes = TRUE
@@ -97,7 +96,7 @@
cost = 40000
unit_name = "Blood Contract"
export_types = list(/obj/item/blood_contract)
//Artifacts of lavaland
/datum/export/weapon/immortality_talisman
+80 -21
View File
@@ -1,23 +1,38 @@
#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 \"Drop Pod Railgun\".\
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/locked = TRUE
var/printed_beacons = 0 //number of beacons printed. Used to determine beacon names.
var/list/meme_pack_data
var/podID = 0//0 is your standard supply droppod (requires dissassembly after landing), 1 is the bluespace drop pod (teleports out after landing)
var/obj/item/supplypod_beacon/beacon //the linked supplypod beacon
var/area/landingzone = /area/quartermaster/storage //where we droppin boys
var/podID = POD_STANDARD //0 is your standard supply supplypod (requires dissassembly after landing), 1 is the bluespace supply pod (teleports out after landing)
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))
@@ -25,17 +40,24 @@
to_chat(user, "<span class='notice'>You [locked ? "lock" : "unlock"] the interface.</span>")
return
else if(istype(W, /obj/item/disk/cargo/bluespace_pod))
podID = 1//doesnt effect circuit board, so that reversal is possible
podID = POD_BLUESPACE//doesnt effect circuit board, making reversal possible
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)
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 Drop Pod to land anywhere on the station.</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
@@ -68,29 +90,58 @@
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
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]
@@ -108,35 +159,43 @@
rank = "Silicon"
var/reason = ""
var/list/empty_turfs
var/area/landingzone
var/datum/supply_order/SO = new(pack, name, rank, ckey, reason)
if(!(obj_flags & EMAGGED))
if(SO.pack.cost <= SSshuttle.points)
landingzone = locate(/area/quartermaster/storage) in GLOB.sortedAreas
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)
var/LZ = empty_turfs[rand(empty_turfs.len-1)]
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 = locate(/area/quartermaster/storage) in GLOB.sortedAreas
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, SO, podID)
. = TRUE
update_icon()
else
if(SO.pack.cost * (0.72*MAX_EMAG_ROCKETS) <= SSshuttle.points) // bulk discount :^)
landingzone = locate(pick(GLOB.the_station_areas)) in GLOB.sortedAreas
landingzone = locate(pick(GLOB.the_station_areas)) in GLOB.sortedAreas //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 * (1.2*MAX_EMAG_ROCKETS)
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 = empty_turfs[rand(empty_turfs.len-1)]
var/LZ = pick(empty_turfs)
LAZYREMOVE(empty_turfs, LZ)
new /obj/effect/DPtarget(LZ, SO, podID)
. = TRUE
+86 -16
View File
@@ -32,11 +32,12 @@
if (admin_spawned)
for(var/item in contains)
var/atom/A = new item(C)
A.admin_spawned = TRUE
A.flags_1 |= ADMIN_SPAWNED_1
else
for(var/item in contains)
new item(C)
// If you add something to this list, please group it by type and sort it alphabetically instead of just jamming it in like an animal
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Emergency ///////////////////////////////////////
@@ -715,7 +716,7 @@
//////////////////////////////////////////////////////////////////////////////
//////////////////////// Engine Construction /////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/engine
group = "Engine Construction"
@@ -851,7 +852,7 @@
crate_name = "supermatter shard crate"
crate_type = /obj/structure/closet/crate/secure/engineering
dangerous = TRUE
/datum/supply_pack/engine/tesla_coils
name = "Tesla Coil Crate"
desc = "Whether it's high-voltage executions, creating research points, or just plain old power generation: This pack of four Tesla coils can do it all!"
@@ -1406,7 +1407,7 @@
/obj/item/vending_refill/cola,
/obj/item/vending_refill/cola)
crate_name = "soft drinks supply crate"
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Organic /////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
@@ -1430,7 +1431,7 @@
name = "Beekeeping Starter Crate"
desc = "BEES BEES BEES. Contains three honey frames, a beekeeper suit and helmet, flyswatter, bee house, and, of course, a pure-bred Nanotrasen-Standardized Queen Bee!"
cost = 1500
contains = list(/obj/structure/beebox,
contains = list(/obj/structure/beebox/unwrenched,
/obj/item/honey_frame,
/obj/item/honey_frame,
/obj/item/honey_frame,
@@ -1706,14 +1707,6 @@
/datum/supply_pack/costumes_toys
group = "Costumes & Toys"
/datum/supply_pack/costumes_toys/autodrobe
name = "Autodrobe Supply Crate"
desc = "Autodrobe missing your favorite dress? Solve that issue today with these two autodrobe refills."
cost = 1500
contains = list(/obj/item/vending_refill/autodrobe,
/obj/item/vending_refill/autodrobe)
crate_name = "autodrobe supply crate"
/datum/supply_pack/costumes_toys/randomised
name = "Collectable Hats Crate"
desc = "Flaunt your status with three unique, highly-collectable hats!"
@@ -1942,6 +1935,73 @@
var/item = pick_n_take(L)
new item(C)
/datum/supply_pack/costumes_toys/wardrobes/autodrobe
name = "Autodrobe Supply Crate"
desc = "Autodrobe missing your favorite dress? Solve that issue today with these two autodrobe refills."
cost = 1500
contains = list(/obj/item/vending_refill/autodrobe,
/obj/item/vending_refill/autodrobe)
crate_name = "autodrobe supply crate"
/datum/supply_pack/costumes_toys/wardrobes/cargo
name = "Cargo Department Supply Crate"
desc = "This crate contains a refill for the CargoDrobe."
cost = 750
contains = list(/obj/item/vending_refill/wardrobe/cargo_wardrobe)
crate_name = "cargo department supply crate"
/datum/supply_pack/costumes_toys/wardrobes/engineering
name = "Engineering Department Wardrobe Supply Crate"
desc = "This crate contains refills for the EngiDrobe and AtmosDrobe."
cost = 1500
contains = list(/obj/item/vending_refill/wardrobe/engi_wardrobe,
/obj/item/vending_refill/wardrobe/atmos_wardrobe)
crate_name = "engineering department wardrobe supply crate"
/datum/supply_pack/costumes_toys/wardrobes/general
name = "General Wardrobes Supply Crate"
desc = "This crate contains refills for the CuraDrobe, BarDrobe, ChefDrobe, JaniDrobe, ChapDrobe."
cost = 3750
contains = list(/obj/item/vending_refill/wardrobe/curator_wardrobe,
/obj/item/vending_refill/wardrobe/bar_wardrobe,
/obj/item/vending_refill/wardrobe/chef_wardrobe,
/obj/item/vending_refill/wardrobe/jani_wardrobe,
/obj/item/vending_refill/wardrobe/chap_wardrobe)
crate_name = "general wardrobes vendor refills"
/datum/supply_pack/costumes_toys/wardrobes/hydroponics
name = "Hydrobe Supply Crate"
desc = "This crate contains a refill for the Hydrobe."
cost = 750
contains = list(/obj/item/vending_refill/wardrobe/hydro_wardrobe)
crate_name = "hydrobe supply crate"
/datum/supply_pack/costumes_toys/wardrobes/medical
name = "Medical Department Wardrobe Supply Crate"
desc = "This crate contains refills for the MediDrobe, ChemDrobe, GeneDrobe, and ViroDrobe."
cost = 3000
contains = list(/obj/item/vending_refill/wardrobe/medi_wardrobe,
/obj/item/vending_refill/wardrobe/chem_wardrobe,
/obj/item/vending_refill/wardrobe/gene_wardrobe,
/obj/item/vending_refill/wardrobe/viro_wardrobe)
crate_name = "medical department wardrobe supply crate"
/datum/supply_pack/costumes_toys/wardrobes/science
name = "Science Department Wardrobe Supply Crate"
desc = "This crate contains refills for the SciDrobe and RoboDrobe."
cost = 1500
contains = list(/obj/item/vending_refill/wardrobe/robo_wardrobe,
/obj/item/vending_refill/wardrobe/science_wardrobe)
crate_name = "science department wardrobe supply crate"
/datum/supply_pack/costumes_toys/wardrobes/security
name = "Security Department Supply Crate"
desc = "This crate contains refills for the SecDrobe and LawDrobe."
cost = 1500
contains = list(/obj/item/vending_refill/wardrobe/sec_wardrobe,
/obj/item/vending_refill/wardrobe/law_wardrobe)
crate_name = "security department supply crate"
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Miscellaneous ///////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
@@ -2033,6 +2093,17 @@
contains = list(/obj/item/storage/box/fountainpens)
crate_type = /obj/structure/closet/crate/wooden
/datum/supply_pack/misc/funeral
name = "Funeral Supply crate"
desc = "At the end of the day, someone's gonna want someone dead. Give them a proper send-off with these funeral supplies! Contains a coffin with burial garmets and flowers."
cost = 600
contains = list(/obj/item/clothing/under/burial,
/obj/item/reagent_containers/food/snacks/grown/harebell,
/obj/item/reagent_containers/food/snacks/grown/poppy/geranium
)
crate_name = "coffin"
crate_type = /obj/structure/closet/crate/coffin
/datum/supply_pack/misc/religious_supplies
name = "Religious Supplies Crate"
desc = "Keep your local chaplain happy and well-supplied, lest they call down judgement upon your cargo bay. Contains two bottles of holywater, bibles, chaplain robes, and burial garmets."
@@ -2042,9 +2113,8 @@
/obj/item/storage/book/bible/booze,
/obj/item/storage/book/bible/booze,
/obj/item/clothing/suit/hooded/chaplain_hoodie,
/obj/item/clothing/suit/hooded/chaplain_hoodie,
/obj/item/clothing/under/burial,
/obj/item/clothing/under/burial)
/obj/item/clothing/suit/hooded/chaplain_hoodie
)
crate_name = "religious supplies crate"
/datum/supply_pack/misc/toner
+93
View File
@@ -0,0 +1,93 @@
/obj/item/supplypod_beacon
name = "Supply Pod Beacon"
desc = "A device that can be linked to an Express Supply Console for precision supply pod deliveries. Alt-click to remove link."
icon = 'icons/obj/device.dmi'
icon_state = "supplypod_beacon"
item_state = "radio"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
var/obj/machinery/computer/cargo/express/express_console
var/linked = FALSE
var/ready = FALSE
var/launched = FALSE
/obj/item/supplypod_beacon/proc/update_status(var/consoleStatus)
switch(consoleStatus)
if (SP_LINKED)
linked = TRUE
playsound(src,'sound/machines/twobeep.ogg',50,0)
if (SP_READY)
ready = TRUE
if (SP_LAUNCH)
launched = TRUE
playsound(src,'sound/machines/triple_beep.ogg',50,0)
playsound(src,'sound/machines/warning-buzzer.ogg',50,0)
addtimer(CALLBACK(src, .proc/endLaunch), 33)//wait 3.3 seconds (time it takes for supplypod to land), then update icon
if (SP_UNLINK)
linked = FALSE
playsound(src,'sound/machines/synth_no.ogg',50,0)
if (SP_UNREADY)
ready = FALSE
update_icon()
/obj/item/supplypod_beacon/update_icon()
cut_overlays()
if (launched)
add_overlay("sp_green")
else if (ready)
add_overlay("sp_yellow")
else if (linked)
add_overlay("sp_orange")
/obj/item/supplypod_beacon/proc/endLaunch()
launched = FALSE
update_status()
/obj/item/supplypod_beacon/examine(user)
..()
if(!express_console)
to_chat(user, "<span class='notice'>[src] is not currently linked to a Express Supply console.</span>")
/obj/item/supplypod_beacon/Destroy()
if(express_console)
express_console.beacon = null
return ..()
/obj/item/supplypod_beacon/proc/unlink_console()
if(express_console)
express_console.beacon = null
express_console = null
update_status(SP_UNLINK)
update_status(SP_UNREADY)
/obj/item/supplypod_beacon/proc/link_console(obj/machinery/computer/cargo/express/C, mob/living/user)
if (C.beacon)//if new console has a beacon, then...
C.beacon.unlink_console()//unlink the old beacon from new console
if (express_console)//if this beacon has an express console
express_console.beacon = null//remove the connection the expressconsole has from beacons
express_console = C//set the linked console var to the console
express_console.beacon = src//out with the old in with the news
update_status(SP_LINKED)
if (express_console.usingBeacon)
update_status(SP_READY)
to_chat(user, "<span class='notice'>[src] linked to [C].</span>")
/obj/item/supplypod_beacon/AltClick(mob/user)
if (!user.canUseTopic(src, !issilicon(user)))
return
if (express_console)
unlink_console()
else
to_chat(user, "<span class='notice'>There is no linked console!</span>")
/obj/item/supplypod_beacon/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/pen)) //give a tag that is visible from the linked express console
var/new_beacon_name = stripped_input(user, "What would you like the tag to be?")
if(!user.canUseTopic(src, BE_CLOSE))
return
if(new_beacon_name)
name += " ([tag])"
return
else
return ..()