From 0edc3ea7f334abe43d7c6ca516a9af9cb61bf084 Mon Sep 17 00:00:00 2001 From: Gristlebee <56049844+Gristlebee@users.noreply.github.com> Date: Wed, 28 Aug 2024 13:43:00 -0700 Subject: [PATCH] Back In Black (Market) - Black Market Dead Drops and Stock Cycling (#3249) ## About The Pull Request ### The Catalogue - The Black Market's catalogue now refreshes every hour with new choices. The stock for individual entries will not refresh however if bought. Check in every now and then! - Adds the tech and ammo tab - Entries can be set to have weighting in order to be more or less likely to appear. Items that recently appeared will be less likely to show up again, and vice-versa for items that haven't. Particularly rare or powerful items are exempted from weighting to stop them showing up too often. - Kills some items, adds some new items and adjusts some prices and percentages. - All blackmarket items are added to the market on generation, and unavailable items are hidden. - Paired items are now handled by a list so items can have multiple paired items. ### Items - Reflavours the ethereal disco grenade and makes it work on elzu. - Makes the powerfist actually work again. The gasused datum removed itself before it could do the pressure checks. - Adds a var (show_rigged) to power cells to whether they display they're going to explode or not. This is a surprise tool that will hurt you later. ### Delivery Changes - Adds a new delivery method, Dead drops. The black market will drop off your package somewhere near the ruin on the planet you're on. If there isn't a ruin, or a viable spot to land, it'll send it somewhere random and it's up to you to find it. A generally consistent way to get your packages - Makes launch more reliable, and your orders will no longer bounce off your ship back into the void. - The LTSRBT has been removed from the outpost market. The board lives in the Black Market as an occasional spawn in the tech category, or can be crafted with 2 BS crystals, a bank card, 5 duct tape, a circuit board and a network card. The cost for bluespace shipping is now 100 credits up from 50. ### Mechanical and Code Stuff - Dynamic Encounters keep track of what map templates/ruins were spawned in them in a list. Used for Dead dead drops so they can calculate a landing spot, and should hopefully be useful in the future if we need to get info about the ruins for whatever reason. - adds get_block_portion and get_position_in_margin to mapzones.dm - Makes the black market UI a bit wider so all the delivery options fit on the menu nicely - adds a parameter for get_overmap_object_by_locatiion to check for the planet you're on exclusively rather than the ship ## Why It's Good For The Game The main intent of the PR was to mitigate the reliance of the LTRSBT as a medium to effectively interact with the black market and was just a 1000 credit buy in fee effectively. It wasn't helped by the Launch was unreliable to the point of being useless, and it feels really bad to make a 10k purchase just to turn up empty handed cause it bounced off your ship by a trajectory out of your control. Having other viable methods of interacting with the black market should hopefully mitigate the issue. Not to mention it felt a bit weird in retrospect you could buy the Super Spooky Illegal Machine at the outpost. It also doesn't pigeonhole you into asking your captain for an LTSRBT if you want to smuggle in gear . The Black Market stock cycling was something that seemed like people wanted, so it here it is. Weighting also adds a bit more fine control on what appears. Rylie asked me to reflavour the disco grenade, and I thought it'd be funny so here it is too. ## Changelog :cl: add: Black Market Stock Cycling and item weighting add: New black market stock add: Tech and Ammo tab add: Dead Drops add: LTRSBT moved to the Black Market Catalogue add: LTSRBT Crafting Recipe, 2 BS crystals, a bank card, 5 duct tape, a circuit board and a network card add: Reflavours the disco grenade add: variable for powercells to show if they're rigged del: Some old blackmarket stock balance: LTRSBT shipping cost up to 100 credits balance: Launch delivery more reliable fix: Powerfist works again spellcheck: fixed a few typos in the black market code: Dynamic Overmap encounters store what ruins were spawned code: get_block_portion and get_position_in_margin methods in mapzones.dm code: Pair items now handled by a list refactor: Black Market item stocking /:cl: --------- Signed-off-by: Gristlebee <56049844+Gristlebee@users.noreply.github.com> Co-authored-by: Theos --- code/__DEFINES/blackmarket.dm | 2 + code/controllers/subsystem/blackmarket.dm | 68 ++++- code/controllers/subsystem/overmap.dm | 8 +- code/datums/map_zones.dm | 6 + code/game/objects/items/etherealdiscoball.dm | 16 +- .../objects/items/grenades/discogrenade.dm | 18 +- code/game/objects/items/powerfist.dm | 3 +- .../structures/crates_lockers/crates.dm | 18 ++ .../cargo/blackmarket/blackmarket_item.dm | 39 ++- .../blackmarket/blackmarket_items/ammo.dm | 221 +++++++++++++++ .../blackmarket/blackmarket_items/clothing.dm | 104 ++++++- .../blackmarket_items/consumables.dm | 156 ++++++++--- .../blackmarket_items/explosives.dm | 55 +++- .../blackmarket/blackmarket_items/misc.dm | 78 ++++-- .../blackmarket/blackmarket_items/tech.dm | 214 +++++++++++++++ .../blackmarket/blackmarket_items/tools.dm | 59 ++-- .../blackmarket/blackmarket_items/weapons.dm | 258 +++++++----------- .../cargo/blackmarket/blackmarket_market.dm | 43 ++- .../cargo/blackmarket/blackmarket_telepad.dm | 17 +- .../cargo/blackmarket/blackmarket_uplink.dm | 15 +- code/modules/cargo/packs/machinery.dm | 12 - code/modules/overmap/objects/dynamic_datum.dm | 3 + code/modules/power/cell.dm | 5 +- .../reagents/reagent_containers/jug.dm | 5 + shiptest.dme | 2 + .../tgui/interfaces/BlackMarketUplink.js | 2 +- 26 files changed, 1124 insertions(+), 303 deletions(-) create mode 100644 code/modules/cargo/blackmarket/blackmarket_items/ammo.dm create mode 100644 code/modules/cargo/blackmarket/blackmarket_items/tech.dm diff --git a/code/__DEFINES/blackmarket.dm b/code/__DEFINES/blackmarket.dm index 042066df522d..c87f0443c4e1 100644 --- a/code/__DEFINES/blackmarket.dm +++ b/code/__DEFINES/blackmarket.dm @@ -5,4 +5,6 @@ #define SHIPPING_METHOD_LTSRBT "LTSRBT" // Throws the item from somewhere at the uplink. #define SHIPPING_METHOD_LAUNCH "Launch" +// Drops the item somewhere on the map +#define SHIPPING_METHOD_DEAD_DROP "Dead drop" diff --git a/code/controllers/subsystem/blackmarket.dm b/code/controllers/subsystem/blackmarket.dm index cbd07fcd8fda..99a6932570b8 100644 --- a/code/controllers/subsystem/blackmarket.dm +++ b/code/controllers/subsystem/blackmarket.dm @@ -6,7 +6,8 @@ SUBSYSTEM_DEF(blackmarket) /// Descriptions for each shipping methods. var/shipping_method_descriptions = list( SHIPPING_METHOD_LAUNCH="Launches the item at your coordinates from across deep space. Cheap, but you might not recieve your item at all. We recommend being stationary in space, away from any large structures, for best results.", - SHIPPING_METHOD_LTSRBT="Long-To-Short-Range-Bluespace-Transceiver, a machine that prepares items at a remote storage location and then teleports them to the location of the LTRSBT." + SHIPPING_METHOD_DEAD_DROP="Our couriers will fire your item via orbital drop pod at the nearest safe abandoned structure for discreet pick up. Reliable, but you'll have to find your package yourself. We accept no responsibility for lost packages if you try to do this in empty space or the outpost.", + SHIPPING_METHOD_LTSRBT="Long-To-Short-Range-Bluespace-Transceiver, a machine that prepares items at a remote storage location and then teleports them to the location of the LTRSBT. Secure, quick and reliable, though it ain't cheap to do." ) /// List of all existing markets. @@ -32,6 +33,9 @@ SUBSYSTEM_DEF(blackmarket) markets[M].add_item(item, FALSE) qdel(I) + for(var/market in markets) + var/datum/blackmarket_market/market_to_cycle = markets[market] + market_to_cycle.cycle_stock() . = ..() /datum/controller/subsystem/blackmarket/fire(resumed) @@ -62,16 +66,72 @@ SUBSYSTEM_DEF(blackmarket) var/startSide = pick(GLOB.cardinals) var/turf/T = get_turf(purchase.uplink) var/datum/virtual_level/vlevel = T.get_virtual_level() - var/pickedloc = vlevel.get_side_turf(startSide) + var/turf/pickedloc + + switch(startSide) + if(NORTH) + pickedloc = locate(T.x, (vlevel.high_y - vlevel.reserved_margin),T.z) + if(EAST) + pickedloc = locate((vlevel.high_x - vlevel.reserved_margin), T.y ,T.z) + if(SOUTH) + pickedloc = locate(T.x, (vlevel.low_y + vlevel.reserved_margin),T.z) + if(WEST) + pickedloc = locate((vlevel.low_x + vlevel.reserved_margin), T.y ,T.z) + else + pickedloc = vlevel.get_side_turf(startSide) var/atom/movable/item = purchase.entry.spawn_item(pickedloc) - item.safe_throw_at(purchase.uplink, 3, 3, spin = FALSE) - + item.Move(get_step(pickedloc,get_dir(pickedloc,T))) to_chat(recursive_loc_check(purchase.uplink.loc, /mob), "[purchase.uplink] flashes a message noting the order is being launched at your coordinates from [dir2text(startSide)].") queued_purchases -= purchase qdel(purchase) + // Drop the order somewhere with the bounds of overmap encounter's ruin + if(SHIPPING_METHOD_DEAD_DROP) + var/datum/overmap/dynamic/overmap_loc = SSovermap.get_overmap_object_by_location(purchase.uplink, TRUE) + var/datum/virtual_level/zlevel = purchase.uplink.get_virtual_level() + var/turf/landing_turf + var/datum/map_template/ruin + if(!isnull(overmap_loc)) + for(var/possible_ruin in overmap_loc.ruin_turfs) + var/turf/lowerbound = overmap_loc.ruin_turfs[possible_ruin] + ruin = overmap_loc.spawned_ruins[possible_ruin] + var/list/possible_ruin_turfs = zlevel.get_block_portion(lowerbound.x,lowerbound.y,(lowerbound.x + ruin.width),(lowerbound.y + ruin.height)) + for(var/cycle in 1 to length(possible_ruin_turfs)) + var/potential_turf = pick_n_take(possible_ruin_turfs) + if(!isopenturf(potential_turf)) + continue + var/turf/open/potential_open_turf = potential_turf + if(ischasm(potential_open_turf)) + continue + if(islava(potential_open_turf)) + var/turf/open/lava/potential_lava_floor = potential_open_turf + if(!potential_lava_floor.is_safe()) + continue + if(istype(potential_open_turf, /turf/open/water/acid)) + var/turf/open/water/acid/potential_acid_floor = potential_open_turf + if(!potential_acid_floor.is_safe_to_cross()) + continue + if(potential_open_turf.is_blocked_turf()) + continue + + //yippee, there's a viable turf for the package to land on + landing_turf = potential_open_turf + to_chat(recursive_loc_check(purchase.uplink.loc, /mob),"[purchase.uplink] flashes a message noting the order is being launched at a structure in your local area.") + break + + if(!landing_turf) + landing_turf = zlevel.get_random_position_in_margin() + to_chat(recursive_loc_check(purchase.uplink.loc, /mob), "[purchase.uplink] flashes a message that the pod was unable to reach it's designated landing spot, and has landed somewhere in the local area instead.") + + var/obj/structure/closet/supplypod/pod = new() + pod.setStyle(STYLE_BOX) + purchase.entry.spawn_item(pod) + pod.explosionSize = list(0,0,0,1) + new /obj/effect/pod_landingzone(landing_turf, pod) + queued_purchases -= purchase + qdel(purchase) if(MC_TICK_CHECK) break diff --git a/code/controllers/subsystem/overmap.dm b/code/controllers/subsystem/overmap.dm index 1304eeeb34ea..113bfefa7a52 100644 --- a/code/controllers/subsystem/overmap.dm +++ b/code/controllers/subsystem/overmap.dm @@ -291,6 +291,7 @@ SUBSYSTEM_DEF(overmap) mapgen.generate_turfs(vlevel.get_unreserved_block()) var/list/ruin_turfs = list() + var/list/ruin_templates = list() if(used_ruin) var/turf/ruin_turf = locate( rand( @@ -302,6 +303,7 @@ SUBSYSTEM_DEF(overmap) ) used_ruin.load(ruin_turf) ruin_turfs[used_ruin.name] = ruin_turf + ruin_templates[used_ruin.name] = used_ruin // fill in the turfs, AFTER generating the ruin. this prevents them from generating within the ruin // and ALSO prevents the ruin from being spaced when it spawns in @@ -376,7 +378,7 @@ SUBSYSTEM_DEF(overmap) quaternary_dock.dwidth = 0 docking_ports += quaternary_dock - return list(mapzone, docking_ports, ruin_turfs) + return list(mapzone, docking_ports, ruin_turfs, ruin_templates) /** * Returns a random, usually empty turf in the overmap @@ -418,10 +420,10 @@ SUBSYSTEM_DEF(overmap) * Gets the parent overmap object (e.g. the planet the atom is on) for a given atom. * * source - The object you want to get the corresponding parent overmap object for. */ -/datum/controller/subsystem/overmap/proc/get_overmap_object_by_location(atom/source) +/datum/controller/subsystem/overmap/proc/get_overmap_object_by_location(atom/source, exclude_ship = FALSE) var/turf/T = get_turf(source) var/area/ship/A = get_area(source) - while(istype(A) && A.mobile_port) + while(istype(A) && A.mobile_port && !exclude_ship) if(A.mobile_port.current_ship) return A.mobile_port.current_ship A = A.mobile_port.underlying_turf_area[T] diff --git a/code/datums/map_zones.dm b/code/datums/map_zones.dm index c50b93cb2dd7..c4e304fb5394 100644 --- a/code/datums/map_zones.dm +++ b/code/datums/map_zones.dm @@ -533,6 +533,9 @@ /datum/virtual_level/proc/get_block() return block(locate(low_x,low_y,z_value), locate(high_x,high_y,z_value)) +/datum/virtual_level/proc/get_block_portion(lower_x, lower_y, higher_x, higher_y) + return block(locate(lower_x,lower_y,z_value), locate(higher_x,higher_y,z_value)) + /datum/virtual_level/proc/get_unreserved_block() return block(locate(low_x + reserved_margin, low_y + reserved_margin, z_value), locate(high_x - reserved_margin,high_y - reserved_margin,z_value)) @@ -542,6 +545,9 @@ /datum/virtual_level/proc/get_random_position() return locate(rand(low_x, high_x), rand(low_y, high_y), z_value) +/datum/virtual_level/proc/get_random_position_in_margin() + return locate(rand(low_x + reserved_margin, high_x - reserved_margin), rand(low_y + reserved_margin, high_y - reserved_margin), z_value) + /datum/virtual_level/proc/get_below_turf(turf/Turf) if(!down_linkage) return diff --git a/code/game/objects/items/etherealdiscoball.dm b/code/game/objects/items/etherealdiscoball.dm index 94f1ae2a6062..75084c239e53 100644 --- a/code/game/objects/items/etherealdiscoball.dm +++ b/code/game/objects/items/etherealdiscoball.dm @@ -1,18 +1,18 @@ /obj/item/etherealballdeployer - name = "Portable Ethereal Disco Ball" - desc = "Press the button for a deployment of slightly-unethical PARTY!" + name = "Portable Animatronic Disco Ball" + desc = "Press the button for a deployment of a copyright free PARTY!" icon = 'icons/obj/device.dmi' icon_state = "ethdisco" /obj/item/etherealballdeployer/attack_self(mob/living/carbon/user) .=..() - to_chat(user, "You deploy the Ethereal Disco Ball.") + to_chat(user, span_notice("You deploy the Ethereal Disco Ball.")) new /obj/structure/etherealball(user.loc) qdel(src) /obj/structure/etherealball - name = "Ethereal Disco Ball" - desc = "The ethics of this discoball are questionable." + name = "Animatronic Disco Ball" + desc = "A discoball with an animatronic head inside, seemingly in the likeness of a famous elzousza muscisian. A disclaimer on the side says any resemblence to living persons is entirely coincidental." icon = 'icons/obj/device.dmi' icon_state = "ethdisco_head_0" anchored = TRUE @@ -31,15 +31,15 @@ . = ..() if(TurnedOn) TurnOff() - to_chat(user, "You turn the disco ball off!") + to_chat(user, span_notice("You turn the disco ball off!")) else TurnOn() - to_chat(user, "You turn the disco ball on!") + to_chat(user, span_notice("You turn the disco ball on!")) /obj/structure/etherealball/AltClick(mob/living/carbon/human/user) . = ..() set_anchored(!anchored) - to_chat(user, "You [anchored ? null : "un"]lock the disco ball.") + to_chat(user, span_notice("You [anchored ? null : "un"]lock the disco ball.")) /obj/structure/etherealball/proc/TurnOn() TurnedOn = TRUE //Same diff --git a/code/game/objects/items/grenades/discogrenade.dm b/code/game/objects/items/grenades/discogrenade.dm index 84ce765d59d3..c582a35e3ff3 100644 --- a/code/game/objects/items/grenades/discogrenade.dm +++ b/code/game/objects/items/grenades/discogrenade.dm @@ -1,5 +1,3 @@ -//Ethereal Disco Grenade for Ethereal traitors -//Does not affect ethereals. //Some basic code pieces taken from flashbang, spawner grenade and ethereal disco ball for functionality (basically a combination of the 3). ////////////////////// @@ -7,8 +5,8 @@ ////////////////////// /obj/item/grenade/discogrenade - name = "Ethereal Disco Grenade" - desc = "An unethical micro-party that will make all non-Ethereal beings dance to its beat!" + name = "Portable Disco Grenade" + desc = "An exotic prototype grenade. Through powerful audiovisual hypnotic cues, victims are afflicted with an unstoppable urge to boogie down. " icon_state = "disco" item_state = "flashbang" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' @@ -91,7 +89,7 @@ return if(target.stat != CONSCIOUS) //Only conscious people can dance return - if(!target || iselzuose(target)) //Non humans and non etherals can't dance + if(!target) //Non humans and non etherals can't dance return var/distance = max(0,get_dist(get_turf(src), target_turf)) @@ -102,27 +100,27 @@ target.say(pick(message_social_anxiety)) if(rand(3) && target.get_ear_protection() == 0) target.drop_all_held_items() - target.show_message("You cover your ears, the music is just too loud for you.", 2) + target.show_message(span_warning("You cover your ears, the music is just too loud for you."), 2) return if(HAS_TRAIT(target, TRAIT_MINDSHIELD)) - target.show_message("You resist your inner urges to break out your best moves.", 2) + target.show_message(span_warning("You resist your inner urges to break out your best moves."), 2) target.set_drugginess(5) return if(istype(target.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/foilhat)) - to_chat(target, "THOSE GLOW-IN-THE-DARK NANOTRASEN LIGHTBULBS WON'T CORRUPT ME WITH THEIR AGENDA!") + to_chat(target, span_userdanger("BIG DISCO WON'T CORRUPT ME WITH THEIR POST ICW PSY-OP MUSIC!")) target.emote("scream") return target.set_drugginess(10) - target.show_message("You feel a strong rythme and your muscles spasm uncontrollably, you begin dancing and cannot move!", 2) + target.show_message(span_warning("You feel a strong rythme and your muscles spasm uncontrollably, you begin dancing and cannot move!"), 2) target.Immobilize(30) //Special actions switch(rand(0, 6)) if(0) target.Knockdown(4) - target.show_message("You [pick("mess", "screw")] up your moves and trip!", 2) + target.show_message(span_warning("You [pick("mess", "screw")] up your moves and trip!"), 2) if(1 to 3) target.emote("spin") if(3 to 4) diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index c41142d4ad24..13d1d10230f0 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -75,6 +75,7 @@ return var/datum/gas_mixture/gasused = tank.air_contents.remove(gasperfist * fisto_setting) var/turf/T = get_turf(src) + var/mols_used = gasused.total_moles() if(!T) return T.assume_air(gasused) @@ -86,7 +87,7 @@ target.visible_message("[user]'s powerfist lets out a dull thunk as [user.p_they()] punch[user.p_es()] [target.name]!", \ "[user]'s punches you!") return - if(gasused.total_moles() < gasperfist * fisto_setting) + if(mols_used < gasperfist * fisto_setting) to_chat(user, "\The [src]'s piston-ram lets out a weak hiss, it needs more gas!") playsound(loc, 'sound/weapons/punch4.ogg', 50, TRUE) target.apply_damage((force / 2), BRUTE) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 3729f41af36e..3cd9cd13796e 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -293,3 +293,21 @@ new /obj/item/clothing/mask/breath(src) for(var/i in 1 to 3) new /obj/item/tank/internals/oxygen(src) + +/obj/structure/closet/crate/cyborg + name = "Cyborg Construction Crate" + desc = "A crate containing the parts to build a cyborg frame." + icon_state = "scicrate" + +/obj/structure/closet/crate/cyborg/PopulateContents() + . = ..() + new /obj/item/bodypart/l_arm/robot(src) + new /obj/item/bodypart/r_arm/robot(src) + new /obj/item/bodypart/leg/left/robot(src) + new /obj/item/bodypart/leg/right/robot(src) + new /obj/item/bodypart/chest/robot(src) + new /obj/item/bodypart/head/robot(src) + new /obj/item/robot_suit(src) + new /obj/item/stock_parts/cell/high(src) + for(var/i in 1 to 2) + new /obj/item/assembly/flash/handheld(src) diff --git a/code/modules/cargo/blackmarket/blackmarket_item.dm b/code/modules/cargo/blackmarket/blackmarket_item.dm index cbadddcf1221..00ed7e3bee38 100644 --- a/code/modules/cargo/blackmarket/blackmarket_item.dm +++ b/code/modules/cargo/blackmarket/blackmarket_item.dm @@ -24,23 +24,56 @@ var/stock_min = 1 /// Maximum amount that there should be of this item in the market if generated randomly. var/stock_max = 0 + /// Whether the item is visible and purchasable on the market + var/available = TRUE /// Probability for this item to be available. Used by SSblackmarket on init. var/availability_prob = 0 + /// If this item should be more or less likely to spawn than usual. Positive is more likely, negative is less + var/weight = 0 + /// If this item is affected by avalibility weight. For items that shouldnt appear on their own (paired items), should always appear, or items paticularly rare or powerful that we dont want showing up too often + var/spawn_weighting // Should there be an unlimited stock of an item var/unlimited = FALSE /// Should another item spawn alongside this one in the catalogue? - var/datum/blackmarket_item/pair_item + var/list/pair_item = null + /datum/blackmarket_item/New() if(isnull(price)) - price = rand(price_min, price_max) + randomize_price() if(isnull(stock)) - stock = rand(stock_min, stock_max) + randomize_stock() + if(isnull(spawn_weighting)) + if(availability_prob == 0 || availability_prob == 100) + spawn_weighting = FALSE + else + spawn_weighting = TRUE /// Used for spawning the wanted item, override if you need to do something special with the item. /datum/blackmarket_item/proc/spawn_item(loc) return new item(loc) +/datum/blackmarket_item/proc/randomize_price() + price = rand(price_min, price_max) + +/datum/blackmarket_item/proc/randomize_stock() + stock = rand(stock_min, stock_max) + +/datum/blackmarket_item/proc/cycle(price = TRUE, availibility = TRUE, stock = FALSE, force_appear = FALSE) + if(price) + randomize_price() + if(stock) + randomize_stock() + if(availibility) + if(spawn_weighting ? prob(max(0, (availability_prob + (weight * 10)))) : prob(availability_prob)) + available = TRUE + weight-- + else + available = FALSE + weight++ + if(force_appear) + available = TRUE + /// Buys the item and makes SSblackmarket handle it. /datum/blackmarket_item/proc/buy(obj/item/blackmarket_uplink/uplink, mob/buyer, shipping_method) // Sanity diff --git a/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm b/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm new file mode 100644 index 000000000000..dcc5c56b93c2 --- /dev/null +++ b/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm @@ -0,0 +1,221 @@ +/datum/blackmarket_item/ammo + category = "Ammunition" + +/datum/blackmarket_item/ammo/shotgun_dart + name = "Shotgun Dart" + desc = "These handy darts can be filled up with any chemical and be shot with a shotgun! \ + Prank your friends by shooting them with laughter! \ + Not recommended for comercial use." + item = /obj/item/ammo_casing/shotgun/dart + + price_min = 10 + price_max = 50 + stock_min = 10 + stock_max = 60 + availability_prob = 40 + +/datum/blackmarket_item/ammo/himehabu_mag + name = "Himehabu Magazines" + desc = "Compact 10 round .22 LR magazines for use in the Himehabu pistol." + item = /obj/item/ammo_box/magazine/m22lr + + price_min = 100 + price_max = 200 + stock_min = 6 + stock_max = 10 + availability_prob = 0 + +/datum/blackmarket_item/ammo/himehabu_box + name = ".22 LR Ammo Box" + desc = "A 75 round ammo box of .22 LR. Trust me, you'll need every shot." + item = /obj/item/ammo_box/c22lr_box + + price_min = 100 + price_max = 300 + stock_min = 6 + stock_max = 10 + availability_prob = 0 + +/datum/blackmarket_item/ammo/a357_box + name = ".357 Ammo Box" + desc = "A 50 round ammo box of .357." + item = /obj/item/ammo_box/a357_box + + price_min = 150 + price_max = 500 + stock_min = 3 + stock_max = 6 + availability_prob = 0 + +/datum/blackmarket_item/ammo/e40_mag + name = "Eoehoma .299 Caseless Magazine" + desc = "A 30 round magazine for the E-40 Hybrid Rifle." + item = /obj/item/ammo_box/magazine/e40 + + price_min = 750 + price_max = 1250 + stock = 6 + availability_prob = 0 + +/datum/blackmarket_item/ammo/saber_mag + name = "Saber 9mm SMG Magazines" + desc = "Magazines for use in the Saber 9mm SMG. No, they don't work as swords." + item = /obj/item/ammo_box/magazine/smgm9mm + + price_min = 500 + price_max = 1000 + stock_min = 4 + stock_max = 6 + availability_prob = 0 + +/datum/blackmarket_item/ammo/model_h_mag + name = "Model H Magazine" + desc = "A 10 round magazine for Model H slug pistol." + item = /obj/item/ammo_box/magazine/modelh + + price_min = 500 + price_max = 1000 + stock_max = 4 + availability_prob = 0 + +/datum/blackmarket_item/ammo/sgg_stripper + name = "8x58mm Stripper Clip" + desc = "A five round 8x58mm stripper clip for use with the SGG-669C. Also doubles as a paperweight, because of course it does. Fucking Solarians." + item = /obj/item/ammo_box/a858 + + price_min = 500 + price_max = 1000 + stock_min = 6 + stock_max = 8 + availability_prob = 0 + +/datum/blackmarket_item/ammo/pistole_c_mag + name = "5.56 Caseless Magazine" + desc = "A 12 round magazine for the Pistole Cheese." + item = /obj/item/ammo_box/magazine/pistol556mm + + price_min = 250 + price_max = 750 + stock = 2 + availability_prob = 0 + +/datum/blackmarket_item/ammo/proto_gauss_mag + name = "Prototype Gauss Rifle Magazine" + desc = "A 25 round ferromagnetic pellet magazine for the prototype gauss rifle. Choking hazard, keep pellets away from children under the age of 5." + item = /obj/item/ammo_box/magazine/gauss + + price_min = 500 + price_max = 800 + stock_min = 3 + stock_max = 5 + availability_prob = 0 + +/datum/blackmarket_item/ammo/tec_mag + name = "TEC-9 AP Magazine" + desc = "A 20 round magazine of AP ammo for the TEC-9 machine pistol." + item = /obj/item/ammo_box/magazine/tec9 + + price_min = 500 + price_max = 1000 + stock_min = 3 + stock_max = 5 + availability_prob = 0 + +/datum/blackmarket_item/ammo/polymer_clip + name = "7.62 Stripper Clip" + desc = "A 5 round stripper clip of 7.62x40mm CLIP." + item = /obj/item/ammo_box/a762_stripper + + price_min = 500 + price_max = 750 + stock_min = 4 + stock_max = 6 + availability_prob = 0 + +/datum/blackmarket_item/ammo/carbine_mag + name = "SKM-24v Magazine" + desc = "A 30 round magazine of 4.6x30mm for the SKM-24v. A hermit classic." + item = /obj/item/ammo_box/magazine/skm_545_39 + + price_min = 500 + price_max = 1000 + stock_min = 3 + stock_max = 5 + availability_prob = 40 + +/datum/blackmarket_item/ammo/skm_extended + name = "Extended SKM Magazine" + desc = "An extended 40 round 7.62x40mm CLIP magazine for the SKM family of assault rifles. Extra curves mean extra ammo." + item = /obj/item/ammo_box/magazine/skm_762_40/extended + + price_min = 1000 + price_max = 3000 + stock_max = 4 + availability_prob = 40 + +/datum/blackmarket_item/ammo/skm_drum + name = "SKM Drum Magazine" + desc = "Do you have too much ammo on your hands? Do you have someone you really hate? \ + Do you want them to be absolutely suppressed for the next 15 seconds? \ + This 75 round 7.62x40mm CLIP drum magazine is perfect for you! (SKM not included.)" + item = /obj/item/ammo_box/magazine/skm_762_40/drum + + price_min = 1500 + price_max = 3500 + stock = 2 + availability_prob = 20 + +/datum/blackmarket_item/ammo/damaged_cell + name = "Discount Weapon Power Cells" + desc = "These cells got a little banged up during a raid by GOLD authorities, but they still should be safe to use. Probably." + item = /obj/item/stock_parts/cell/gun + + price_min = 100 + price_max = 400 + stock_min = 5 + stock_max = 10 + availability_prob = 80 + +/datum/blackmarket_item/ammo/damaged_cell/spawn_item(loc) + var/obj/item/stock_parts/cell/damaged_cell = ..() + damaged_cell.name = "dented weapon power cell" + damaged_cell.desc = "A rechargeable electrochemical power cell. This one doesn't appear to be in the greatest condition." + if(prob(35)) + damaged_cell.rigged = TRUE + damaged_cell.show_rigged = FALSE + + return new damaged_cell(loc) + +/datum/blackmarket_item/ammo/advanced_weapon_cell + name = "Upgraded Weapon Power Cells" + desc = "These upgraded weapon powercells come with twice the capacity of the standard cells, and quality checked to make sure they won't explode!" + item = /obj/item/stock_parts/cell/gun/upgraded + + price_min = 1000 + price_max = 1750 + stock_min = 2 + stock_max = 4 + availability_prob = 25 + +/datum/blackmarket_item/ammo/huge_weapon_cell + name = "Extra Large Weapon Power Cells" + desc = "We're way past double A now. These extra-large power cells (in both charge and size!) are purpose built for the most heavy duty energy weapons." + item = /obj/item/stock_parts/cell/gun/large + + price_min = 2500 + price_max = 4000 + stock = 2 + availability_prob = 20 + spawn_weighting = FALSE + +/datum/blackmarket_item/ammo/mecha_hades_ammo + name = "FNX-99 Incediary Ammo" + desc = "A box of 24 incendiary shells for the FNX-99 mounted carbine." + item = /obj/item/mecha_ammo/incendiary + + price_min = 250 + price_max = 350 + stock_min = 3 + stock_max = 5 + availability_prob = 0 + diff --git a/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm b/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm index a4c4195beca0..d049589fe40a 100644 --- a/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm +++ b/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm @@ -11,6 +11,27 @@ stock_max = 5 availability_prob = 80 +/datum/blackmarket_item/clothing/straitjacket + name = "Straitjacket" + desc = "These straitjackets might be a tight fit, but you can certain the poor sod wont be getting away anytime soon." + item = /obj/item/clothing/suit/straight_jacket + + price_min = 500 + price_max = 1000 + stock_max = 3 + availability_prob = 40 + +/datum/blackmarket_item/clothing/surplus_uniform + name = "Surplus Combat Uniforms" + desc = "A mass produced and non-descript surplus combat uniform. For when you need to look like another faceless thug in the crowd." + item = /obj/item/clothing/under/rank/security/officer/military + + price_min = 50 + price_max = 200 + stock_min = 5 + stock_max = 10 + availability_prob = 80 + /datum/blackmarket_item/clothing/crown name = "Crown" desc = "A beautiful golden crown, rich with history and pedigree. Better worn than left to collect dust in a museum, right?" @@ -18,7 +39,7 @@ price_min = 1000 price_max = 2000 - stock_max = 1 + stock = 1 availability_prob = 20 /datum/blackmarket_item/clothing/galaxy_blue @@ -98,11 +119,31 @@ new /obj/item/clothing/head/helmet/bulletproof/x11/frontier(B) return B +/datum/blackmarket_item/clothing/frontiersmen_armor_fireproof + name = "Fireproof Armor Set" + desc = "Get it while it's hot! This fireproofed armor and uniform set is made with a pre-Night Of Fire miracle material that renders it almost impervious to flames. The Frontiersmen swear by the stuff. It's kept each of it's previous owners safe until they passed away from illness." + item = /obj/item/storage/box + + price_min = 1000 + price_max = 1750 + stock_max = 3 + availability_prob = 50 + +/datum/blackmarket_item/clothing/frontiersmen_armor_fireproof/spawn_item(loc) + var/obj/item/storage/box/B = ..() + B.name = "Fireproof Armor Set Box" + B.desc = "A singed box with some folded clothes and a helmet inside." + new /obj/item/clothing/suit/armor/frontier/fireproof(B) + new /obj/item/clothing/head/helmet/bulletproof/x11/frontier/fireproof(B) + new /obj/item/clothing/under/frontiersmen/fireproof(B) + new /obj/item/clothing/mask/gas/frontiersmen(B) + return B + /datum/blackmarket_item/clothing/gezena_armor name = "Raksha-Plating vest" desc = "Genuine armor vests used by the PGF Marine Corp. If a military guy in a cape comes by, play dumb." item = /obj/item/clothing/suit/armor/gezena/marine - pair_item = /datum/blackmarket_item/clothing/gezena_helmet + pair_item = list(/datum/blackmarket_item/clothing/gezena_helmet) price_min = 750 price_max = 1250 @@ -137,6 +178,54 @@ new /obj/item/clothing/head/helmet/space(B) return B +/datum/blackmarket_item/clothing/syndie_spacesuit_set + name = "\improper Syndicate Branded Spacesuit Box" + desc = "An armored syndicate softsuit, popular among the ACLF operatives who were too broke to get an actual hardsuit." + item = /obj/item/storage/box/syndie_kit + + price_min = 750 + price_max = 2500 + stock_max = 3 + availability_prob = 50 + +/datum/blackmarket_item/clothing/syndie_spacesuit_set/spawn_item(loc) + var/obj/item/storage/box/syndie_kit/B = ..() + B.name = "Spacesuit Box" + B.desc = "It has a Syndicate logo on it." + var/suit_color = pick(list("red","green","dark green","blue","orange","black","black-green","black-blue","black-orange","black-red")) + switch(suit_color) + if("red") + new /obj/item/clothing/head/helmet/space/syndicate(B) + new /obj/item/clothing/suit/space/syndicate(B) + if("green") + new /obj/item/clothing/head/helmet/space/syndicate/green(B) + new /obj/item/clothing/suit/space/syndicate/green(B) + if("dark-green") + new /obj/item/clothing/head/helmet/space/syndicate/green/dark(B) + new /obj/item/clothing/suit/space/syndicate/green/dark(B) + if("orange") + new /obj/item/clothing/head/helmet/space/syndicate/orange(B) + new /obj/item/clothing/suit/space/syndicate/orange(B) + if("blue") + new /obj/item/clothing/head/helmet/space/syndicate/blue(B) + new /obj/item/clothing/suit/space/syndicate/blue(B) + if("black") + new /obj/item/clothing/head/helmet/space/syndicate/black(B) + new /obj/item/clothing/suit/space/syndicate/black(B) + if("black-green") + new /obj/item/clothing/head/helmet/space/syndicate/black/green(B) + new /obj/item/clothing/suit/space/syndicate/black/green(B) + if("black-blue") + new /obj/item/clothing/head/helmet/space/syndicate/black/blue(B) + new /obj/item/clothing/suit/space/syndicate/black/blue(B) + if("black-orange") + new /obj/item/clothing/head/helmet/space/syndicate/black/orange(B) + new /obj/item/clothing/suit/space/syndicate/black/orange(B) + if("black-red") + new /obj/item/clothing/head/helmet/space/syndicate/black/red(B) + new /obj/item/clothing/suit/space/syndicate/black/red(B) + return B + /datum/blackmarket_item/clothing/chameleon_hat name = "Chameleon Hat" desc = "Pick any hat you want with this Handy device. Not Quality Tested." @@ -147,6 +236,17 @@ stock_max = 2 availability_prob = 70 +/datum/blackmarket_item/clothing/cham_kit + name = "Chameleon Kit" + desc = "Not sure what to wear? This adaptive set of clothing can change to suit whatever you desire! Quality tested." + item = /obj/item/storage/box/syndie_kit/chameleon + + price_min = 1000 + price_max = 2500 + stock_max = 2 + availability_prob = 10 + spawn_weighting = FALSE + /datum/blackmarket_item/clothing/combatmedic_suit name = "Combat Medic Hardsuit" desc = "A discarded combat medic hardsuit, found in the ruins of a carpet bombed xeno hive. Definitely used, but as sturdy as an anchor." diff --git a/code/modules/cargo/blackmarket/blackmarket_items/consumables.dm b/code/modules/cargo/blackmarket/blackmarket_items/consumables.dm index e3a20e0e8905..2d9f3af83c06 100644 --- a/code/modules/cargo/blackmarket/blackmarket_items/consumables.dm +++ b/code/modules/cargo/blackmarket/blackmarket_items/consumables.dm @@ -17,10 +17,10 @@ desc = "A random cocktail of luxury drugs that are sure to put a smile on your face!" item = /obj/item/storage/pill_bottle - stock_min = 2 - stock_max = 3 - price_min = 200 - price_max = 500 + stock_min = 4 + stock_max = 6 + price_min = 50 + price_max = 300 availability_prob = 50 /datum/blackmarket_item/consumable/suspicious_pills/spawn_item(loc) @@ -42,6 +42,28 @@ price_max = 60 availability_prob = 50 +/datum/blackmarket_item/consumable/cannabis + name = "Cannabis Leaves" + desc = "Homegrown cannabis, fresh off the garden just for your pleasure!" + item = /obj/item/reagent_containers/food/snacks/grown/cannabis + + stock_min = 4 + stock_max = 6 + price_min = 50 + price_max = 300 + availability_prob = 50 + +/datum/blackmarket_item/consumable/syndie_cigs + name = "Syndicate Cigarettes" + desc = "Who said smoking was bad for you? These omnizine laced cigarettes will have you feeling like a million bucks!" + item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate + + stock_min = 4 + stock_max = 6 + price_min = 50 + price_max = 300 + availability_prob = 50 + /datum/blackmarket_item/consumable/trickwine name = "Trickwine" desc = "The SRM keeps the recipes for their trickwines a closely guarded secret. The Hunters carrying those bottles? Less so." @@ -62,16 +84,16 @@ /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/prismwine)) return new trickwine(loc) +/datum/blackmarket_item/consumable/stimpack + name = "Stimpack" + desc = "A quick inject medipen loaded with a cocktail of powerful stimulants. Side effects may include nasuea, heartburn, constipation, weight loss, increased blood pressure, kidney stones, liver damage, mood swings, mania, anemia, weight gain, total organ failure, runny nose and minor retinal irritation." + item = /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor -/datum/blackmarket_item/consumable/pumpup - name = "Maintenance Pump-Up" - desc = "Resist any Baton stun with this handy instant tetanus free injector!." - item = /obj/item/reagent_containers/hypospray/medipen/pumpup - - stock_max = 3 - price_min = 50 - price_max = 150 - availability_prob = 90 + stock_min = 4 + stock_max = 6 + price_min = 250 + price_max = 500 + availability_prob = 50 /datum/blackmarket_item/consumable/morphine name = "Morphine Bottle" @@ -80,6 +102,7 @@ price_min = 50 price_max = 150 + stock_min = 2 stock_max = 4 availability_prob = 50 @@ -88,9 +111,10 @@ desc = "Cyanide, a tried and true classic for all your poisoning needs." item = /obj/item/reagent_containers/glass/bottle/cyanide - price_min = 300 - price_max = 600 - stock_max = 3 + price_min = 200 + price_max = 400 + stock_min = 2 + stock_max = 4 availability_prob = 30 /datum/blackmarket_item/consumable/sodium_thiopental @@ -98,19 +122,21 @@ desc = "Sodium Thiopental, a potent and fast acting sedative for any occasion." item = /obj/item/reagent_containers/glass/bottle/sodium_thiopental - price_min = 300 + price_min = 250 price_max = 600 - stock_max = 3 + stock_min = 2 + stock_max = 4 availability_prob = 30 /datum/blackmarket_item/consumable/amanitin - name = "Amanitin bottle" + name = "Amanitin Bottle" desc = "A slow acting, but nearly undetectable poison. For the dignified assassin." item = /obj/item/reagent_containers/glass/bottle/amanitin price_min = 300 price_max = 600 - stock_max = 3 + stock_max = 2 + stock_max = 4 availability_prob = 30 /datum/blackmarket_item/consumable/gumballs @@ -124,15 +150,21 @@ stock_max = 20 availability_prob = 80 -/datum/blackmarket_item/consumable/xeno_meat - name = "Xenomorph steak" +/datum/blackmarket_item/consumable/xeno_corpse + name = "Xenomorph Corpse" desc = "The Frontier's most dangerous game, delivered right to your plate! May constitute a violation of your local BARD laws and regulations." - item = /obj/item/reagent_containers/food/snacks/meat/slab/xeno + item = /mob/living/simple_animal/hostile/alien - price_min = 300 - price_max = 500 - stock_max = 5 - availability_prob = 20 + price_min = 6000 + price_max = 10000 + stock = 1 + availability_prob = 10 + spawn_weighting = FALSE + +/datum/blackmarket_item/consumable/xeno_corpse/spawn_item(loc) + var/mob/living/simple_animal/hostile/alien = ..() + alien.stat = DEAD + return new alien(loc) /datum/blackmarket_item/consumable/berries name = "Berries" @@ -157,7 +189,7 @@ item = /obj/effect/spawner/lootdrop/ration price_min = 150 - price_max = 400 + price_max = 300 availability_prob = 80 unlimited = TRUE @@ -177,10 +209,10 @@ desc = "A bundle of sutures for stitching up your latest bullet wound." item = /obj/item/stack/medical/suture - price_min = 200 - price_max = 450 - stock_min = 2 - stock_max = 5 + price_min = 25 + price_max = 150 + stock_min = 4 + stock_max = 6 availability_prob = 40 /datum/blackmarket_item/consumable/regen_mesh @@ -188,10 +220,10 @@ desc = "A smoothing pack of regenerative mesh for your burns." item = /obj/item/stack/medical/mesh - price_min = 200 - price_max = 450 - stock_min = 2 - stock_max = 5 + price_min = 25 + price_max = 150 + stock_min = 4 + stock_max = 6 availability_prob = 40 /datum/blackmarket_item/consumable/bruise_pack @@ -199,19 +231,53 @@ desc = "A bundle of old bruise packs, for you guessed it, bruises. Any rumors of these containing hazardous chemicals are just that. Rumors." item = /obj/item/stack/medical/bruise_pack - price_min = 300 - price_max = 500 - stock_min = 2 - stock_max = 5 + price_min = 50 + price_max = 175 + stock_min = 4 + stock_max = 6 availability_prob = 30 /datum/blackmarket_item/consumable/ointment - name = "Burn ointment" + name = "Burn Ointment" desc = "A tube of burn ointment. It's past the expiry date, but those are only suggestions." item = /obj/item/stack/medical/ointment - price_min = 300 - price_max = 500 - stock_min = 2 - stock_max = 5 + price_min = 50 + price_max = 175 + stock_min = 4 + stock_max = 6 availability_prob = 30 + +/datum/blackmarket_item/consumable/goliath + name = "A Live Goliath" + desc = "We reappropiated an outpost freighter a week back, and the entire thing was packed with goliaths for whatever reason. Point is, we're sick and tired of eating them, so we're selling what's left so we can buy some actual take out." + item = /mob/living/simple_animal/hostile/asteroid/goliath/beast + + price_min = 750 + price_max = 2000 + stock_max = 4 + availability_prob = 15 + spawn_weighting = FALSE + +/datum/blackmarket_item/consumable/color_salve + name = "Color Salve" + desc = "A cosmetic salve used for changing the hue of Elzouse. Now with 20% less harmful chemical dyes!" + item = /obj/item/colorsalve + + price_min = 100 + price_max = 200 + stock_min = 4 + stock_max = 10 + availability_prob = 80 + +/datum/blackmarket_item/consumable/secret_sauce + name = "Family Sauce Recipe" + desc = "This used to belong to a good friend of mine before the authorities did em in. Best goddamn sauce I've ever tasted, but I could never get it right myself. Maybe you can do it justice." + item = /obj/item/paper/secretrecipe + + price_min = 1000 + price_max = 2000 + stock = 1 + availability_prob = 5 + spawn_weighting = FALSE + diff --git a/code/modules/cargo/blackmarket/blackmarket_items/explosives.dm b/code/modules/cargo/blackmarket/blackmarket_items/explosives.dm index 7fe78cdcd055..ab7f62830324 100644 --- a/code/modules/cargo/blackmarket/blackmarket_items/explosives.dm +++ b/code/modules/cargo/blackmarket/blackmarket_items/explosives.dm @@ -11,6 +11,16 @@ stock_max = 5 availability_prob = 50 +/datum/blackmarket_item/explosive/smoke_grenade + name = "Smoke Grenade" + desc = "Too much heat on your back? This handy smoke grenade is perfect for a hasty getaway." + item = /obj/item/grenade/smokebomb + + price_min = 100 + price_max = 400 + stock_max = 5 + availability_prob = 50 + /datum/blackmarket_item/explosive/h_e name = "HE Grenade" desc = "These high explosive grenades are sure to get some bang for your buck." @@ -57,7 +67,7 @@ /datum/blackmarket_item/explosive/slipocalypse name = "Slipocalyse Cluster Bomb" - desc = "Wash away the opposition with sudstastic grenade!" + desc = "Wash away the opposition with this sudstastic grenade!" item = /obj/item/grenade/clusterbuster/soap price_min = 500 @@ -65,9 +75,21 @@ stock = 1 availability_prob = 10 +/datum/blackmarket_item/explosive/disco_grenade + name = "Portable Disco Grenade" + desc = "Become the life of the party with this groovy grenade!" + item = /obj/item/grenade/discogrenade + + price_min = 500 + price_max = 750 + stock_min = 2 + stock_max = 3 + availability_prob = 10 + spawn_weighting = FALSE + /datum/blackmarket_item/explosive/rusted_mine name = "Landmine" - desc = "Recovered from a decades old ICW battlefield by our best EOD tech, Nicky Nine Fingers." + desc = "Recovered from a decade old ICW battlefield by our best EOD tech, Nicky Nine Fingers." item = /obj/item/mine/pressure/explosive/rusty price_min = 250 @@ -84,5 +106,32 @@ price_max = 6500 stock_min = 2 stock_max = 5 - availability_prob = 20 + availability_prob = 10 + spawn_weighting = FALSE + +/datum/blackmarket_item/explosive/live_bomb + name = "Active ICW Era Ordinance" + desc = "Look, I won't mince words. This thing is counting down and I don't want to be the next causualty of ICW after it's already ended. I'll sell it to you real cheap." + item = /obj/machinery/syndicatebomb + + price_min = 500 + price_max = 1000 + stock = 1 + availability_prob = 5 + spawn_weighting = FALSE +/datum/blackmarket_item/explosive/live_bomb/spawn_item(loc) + var/obj/machinery/syndicatebomb/bomb = ..() + bomb.activate() + return new bomb(loc) + +/datum/blackmarket_item/explosive/firecrackers + name = "Firecracker" + desc = "Nuclear Bomb brand extra strength firecrackers, painted in the signature blood red of the Gorlex Marauders. Enjoyed a successful, albeit short run in PGF space due to a certain event in 492 FS made selling them somewhat in poor taste." + item = /obj/item/grenade/firecracker + + price_min = 50 + price_max = 250 + stock_min = 5 + stock_max = 10 + availability_prob = 50 diff --git a/code/modules/cargo/blackmarket/blackmarket_items/misc.dm b/code/modules/cargo/blackmarket/blackmarket_items/misc.dm index a5e2c67175af..8f51514de804 100644 --- a/code/modules/cargo/blackmarket/blackmarket_items/misc.dm +++ b/code/modules/cargo/blackmarket/blackmarket_items/misc.dm @@ -56,31 +56,11 @@ desc = "Why, it could be anything. Are you feeling lucky?" item = /obj/structure/closet/crate/secure/loot - price_min = 250 - price_max = 400 + price_min = 100 + price_max = 300 availability_prob = 100 unlimited = TRUE -/datum/blackmarket_item/misc/spygass - name = "Spy Glass Kit" - desc = "A set of trick glasses and a linked camera. Suit and dashing shades not included." - item = /obj/item/storage/box/rxglasses/spyglasskit - - price_min = 250 - price_max = 1000 - stock_max = 3 - availability_prob = 30 - -/datum/blackmarket_item/misc/ripley_mk_4 - name = "Ripley Mk IV Upgrade Kit" - desc = "Pimp out your Ripley to the CLIP Mark IV Rogue Model today! Killjoy bureaucrats not included, thank god." - item = /obj/item/mecha_parts/mecha_equipment/conversion_kit/ripley/clip - - price_min = 1500 - price_max = 2500 - stock_max = 3 - availability_prob = 30 - /datum/blackmarket_item/misc/secret_docs name = "Classified Documents" desc = "Good people died to get these. Luckily, we aren't good people." @@ -107,3 +87,57 @@ price_max = 10000 stock = 1 availability_prob = 40 + +/datum/blackmarket_item/misc/knockoff_plush + name = "Knockoff T4LI Plush" + desc = "You'll hardly be able to tell that it's an offbrand rip off!" + item = /obj/item/toy/plush/tali + + price_min = 50 + price_max = 150 + stock_min = 2 + stock_max = 5 + availability_prob = 60 + +/datum/blackmarket_item/misc/knockoff_plush/spawn_item(loc) + var/obj/item/toy/plush/tali/plush = ..() + plush.name = "T3MMI" + plush.desc = "A rather shoddy and unlicensed plushie 'paying homage' to a character from the RILENA series." + return new plush(loc) + +/datum/blackmarket_item/misc/pens + name = "Pen" + desc = "We found an old Cybersun blacksite, and came across an unmarked crate full of pens. Want one?" + item = /obj/item/pen + + price_min = 50 + price_max = 150 + unlimited = TRUE + availability_prob = 60 + +/datum/blackmarket_item/misc/pens/spawn_item(loc) + var/pen = pick(list(/obj/item/pen, + /obj/item/pen/blue, + /obj/item/pen/red, + /obj/item/pen/fourcolor, + /obj/item/pen/fountain, + /obj/item/pen/fountain/captain, + /obj/item/pen/solgov, + /obj/item/pen/fountain/solgov, + /obj/item/pen/edagger, + /obj/item/pen/survival, + /obj/item/pen/sleepy)) + return new pen(loc) + +/datum/blackmarket_item/misc/hexacrete + name = "Jug of Hexacrete" + desc = "Need to make a blacksite in a jiffy? Skip the fuss with this 150u jug of hexacrete!" + item = /obj/item/reagent_containers/glass/chem_jug/hexacrete + + price_min = 750 + price_max = 1500 + stock_min = 3 + stock_max = 10 + availability_prob = 30 + + diff --git a/code/modules/cargo/blackmarket/blackmarket_items/tech.dm b/code/modules/cargo/blackmarket/blackmarket_items/tech.dm new file mode 100644 index 000000000000..63db8cbb75d1 --- /dev/null +++ b/code/modules/cargo/blackmarket/blackmarket_items/tech.dm @@ -0,0 +1,214 @@ +/datum/blackmarket_item/tech + category = "Technology" + +/datum/blackmarket_item/tech/ripley_mk_4 + name = "Ripley Mk IV Upgrade Kit" + desc = "Pimp out your Ripley to the CLIP Mark IV Rogue Model today! Killjoy bureaucrats not included, thank god." + item = /obj/item/mecha_parts/mecha_equipment/conversion_kit/ripley/clip + + price_min = 1500 + price_max = 2500 + stock_max = 3 + availability_prob = 30 + +/datum/blackmarket_item/tech/chem_master + name = "Chem Master Board" + desc = "A Chem Master board, capable of seperating and packaging reagents. Perfect for any aspiring at home chemist." + item = /obj/item/circuitboard/machine/chem_master + + price_min = 1000 + price_max = 3000 + stock = 1 + availability_prob = 30 + +/datum/blackmarket_item/tech/ltrsbt + name = "Black Market Long-To-Short-Range-Bluespace-Transciever" + desc = "Need a faster and better way of transporting your illegal goods from and to the sector? Fear not, the Long-To-Short-Range-Bluespace-Transceiver (LTSRBT for short) is here to help. This handy teleporter will teleport your purchases directly to you once built." + item = /obj/item/circuitboard/machine/ltsrbt + + price_min = 500 + price_max = 1000 + stock_max = 3 + availability_prob = 20 + +/datum/blackmarket_item/tech/mrs_pacman + name = "MRSPACMAN-type Generator Board" + desc = "A ridiciously overclocked PACMAN generator that somehow burns diamonds as fuel." + item = /obj/item/circuitboard/machine/pacman/mrs + + price_min = 2000 + price_max = 3000 + stock = 1 + availability_prob = 30 + +/datum/blackmarket_item/tech/ai_core + name = "AI Core Board" + desc = "The future is now! Become one with your ship with this AI core board! (Some assembly required.)" + item = /obj/item/circuitboard/aicore + pair_item = list(/datum/blackmarket_item/tech/boris, /datum/blackmarket_item/tech/mmi, /datum/blackmarket_item/tech/borg) + + price_min = 5000 + price_max = 8000 + stock = 1 + availability_prob = 5 + spawn_weighting = FALSE + +/datum/blackmarket_item/tech/boris + name = "B.O.R.I.S Module" + desc = "A Bluespace Optimi-blah blah blah, I'm bored already. This module will convert a cyborg frame into an AI compatible shell." + item = /obj/item/borg/upgrade/ai + + price_min = 500 + price_max = 1000 + stock = 1 + availability_prob = 0 + +/datum/blackmarket_item/tech/mmi + name = "Man Machine Interface" + desc = "Transcend the weakness of your flesh with this man machine interface, compatible with AIs, Cyborgs and Mechs!" + item = /obj/item/mmi + pair_item = list(/datum/blackmarket_item/tech/borg) + + price_min = 250 + price_max = 750 + stock_max = 3 + availability_prob = 40 + +/datum/blackmarket_item/tech/borg + name = "Cyborg Construction Kit" + desc = "This durable and verastile cyborg frame is capable of fufilling a number of roles and survive situations that would kill the average person. Brain sold seperately." + item = /obj/structure/closet/crate/cyborg + + price_min = 1000 + price_max = 2000 + stock_max = 2 + availability_prob = 0 + +/datum/blackmarket_item/tech/t4_capacitor + name = "Quadratic Capacitor" + desc = "A top grade quadractic capacitor. These highly effiecent capacitors are capable of storing massive amounts of electricity. Keep away from open plugs." + item = /obj/item/stock_parts/capacitor/quadratic + + price_min = 400 + price_max = 700 + stock_min = 2 + stock_max = 4 + availability_prob = 20 + +/datum/blackmarket_item/tech/t4_scanner + name = "Triphasic Scanning Module" + desc = "A top grade triphasic scanning module. These finely tuned scanning modules are usually reserved for vital systems like early warning defence radars against raiders and pirates. We decided to put it to better use." + item = /obj/item/stock_parts/scanning_module/triphasic + + price_min = 400 + price_max = 700 + stock_min = 2 + stock_max = 4 + availability_prob = 20 + +/datum/blackmarket_item/tech/t4_manip + name = "Femto Manipulator" + desc = "A top grade femto manipulator. These insanely precise manipuators are capable of manipulating particles up to a quadtillionth of a meter. Still not precise enough to find a single braincell in an NT exec's head though." + item = /obj/item/stock_parts/manipulator/femto + + price_min = 400 + price_max = 700 + stock_min = 2 + stock_max = 4 + availability_prob = 20 + +/datum/blackmarket_item/tech/t4_laser + name = "Quad-Ultra Microlaser" + desc = "A top grade quad-ultra microlaser. A bit too micro of a laser to actually kill anyone with, but more than enough to get the most out of your materials." + item = /obj/item/stock_parts/micro_laser/quadultra + + price_min = 400 + price_max = 700 + stock_min = 2 + stock_max = 4 + availability_prob = 20 + +/datum/blackmarket_item/tech/t4_bin + name = "Bluespace Matter Bin" + desc = "A top grade bluespace matter bin. Uses the power of bluespace to contain tons of matter without all the hassle of actually needing to carry literal tons with only a miniscule chance of ripping a hole in reality." + item = /obj/item/stock_parts/matter_bin/bluespace + + price_min = 400 + price_max = 700 + stock_min = 2 + stock_max = 4 + availability_prob = 20 + +/datum/blackmarket_item/tech/crew_monitor + name = "Crew Monitor Board" + desc = "A crew monitor computer board, for watching your hapless crew die in real time." + item = /obj/machinery/computer/crew + + price_min = 750 + price_max = 1250 + stock_max = 3 + availability_prob = 40 + +/datum/blackmarket_item/tech/sec_cam + name = "Camera Console Board" + desc = "A camera console computer board, for when you want to invade your crew's privacy." + item = /obj/item/circuitboard/computer/security + + price_min = 750 + price_max = 1250 + stock_max = 3 + availability_prob = 40 + +/datum/blackmarket_item/tech/emag_limited + name = "Limited Cryptographic Sequencer" + desc = "These cryptographic sequencers are perfect for bypassing any mechanical safties or just breaking shit in general. They're pretty old though, and will probably burn out after a single use. Do not keep in the same wallet as your credit card." + item = /obj/item/card/emag/limited + + price_min = 750 + price_max = 1500 + stock_min = 2 + stock_max = 7 + availability_prob = 30 + +/datum/blackmarket_item/tech/joywire + name = "Pleasure Vivifier Neural Implant" + desc = "Midi-Sim's ever popular pleasure vivifier implant promises a constant rush of dopamine to get you high on life." + item = /obj/item/organ/cyberimp/brain/joywire + + price_min = 500 + price_max = 1000 + stock_min = 3 + stock_max = 5 + availability_prob = 50 + +/datum/blackmarket_item/tech/joywire/spawn_item(loc) + if(prob(10)) + var/obj/item/organ/cyberimp/brain/mindscrew/implant = ..() + implant.name = "\improper Midi-Sed pleasure vivifier" + implant.desc = "A widely popular (and addictive) implant produced by Miditeke-Sedari Tokoce that \ + stimulates the brain's pleasure centers. \ + Dramatically increases mood, but interferes with taste reception even if uninstalled. \ + Its wires seem a little loose." + return new implant(loc) + return ..() + +/datum/blackmarket_item/tech/mindscrew + name = "MNDFCK Neural Implant" + desc = "Got a tough customer who refuses to crack? This aftermarket modification of the Midi-Sed pleasure vivifier will amplify their pain receptors and get them talking fast." + item = /obj/item/organ/cyberimp/brain/mindscrew + + price_min = 500 + price_max = 1500 + stock_max = 3 + availability_prob = 30 + +/datum/blackmarket_item/tech/arm_gun + name = "Arm Mounted Laser Cannon Implant" + desc = "A retractable laser cannon that fits inside your arm for concealment. You won't be passing any metal detector scans though." + item = /obj/item/organ/cyberimp/arm/gun/laser + + price_min = 2000 + price_max = 4000 + stock = 1 + availability_prob = 15 + spawn_weighting = FALSE diff --git a/code/modules/cargo/blackmarket/blackmarket_items/tools.dm b/code/modules/cargo/blackmarket/blackmarket_items/tools.dm index d24cbf68171d..412ba303b977 100644 --- a/code/modules/cargo/blackmarket/blackmarket_items/tools.dm +++ b/code/modules/cargo/blackmarket/blackmarket_items/tools.dm @@ -18,12 +18,23 @@ price_min = 500 price_max = 2000 + stock_min = 1 + stock_max = 3 + availability_prob = 40 + +/datum/blackmarket_item/tool/surgery_duffel + name = "Cybersun Advanced Surgical Kit" + desc = "You might say it's morally wrong to steal. I say it's justified when it's Cybersun." + item = /obj/item/storage/backpack/duffelbag/syndie/surgery + + price_min = 2500 + price_max = 5000 stock = 1 - availability_prob = 30 + availability_prob = 25 /datum/blackmarket_item/tool/binoculars name = "Binoculars" - desc = "Increase your sight by 150% with this handy Tool!" + desc = "Twice as effective as a monocular for seeing across long distances." item = /obj/item/binoculars price_min = 50 @@ -32,6 +43,28 @@ stock_max = 4 availability_prob = 70 +/datum/blackmarket_item/tool/whetstone + name = "Whetstone" + desc = "Your blades not making the cut? This whetstone will give you the edge you need!" + item = /obj/item/sharpener + + price_min = 100 + price_max = 300 + stock_min = 2 + stock_max = 4 + availability_prob = 50 + +/datum/blackmarket_item/tool/cham_stamp + name = "Chameleon Stamp" + desc = "Can't find a forger? Look no further than these handy chameleon stamps, capable of replicating all manner of offical or government seals." + item = /obj/item/stamp/chameleon + + price_min = 50 + price_max = 200 + stock_min = 2 + stock_max = 4 + availability_prob = 80 + /datum/blackmarket_item/tool/riot_shield name = "Riot Shield" desc = "Protect yourself from an unexpected Riot at your local Police department!" @@ -47,8 +80,8 @@ desc = "30u of Thermite to assist in creating a quick access point or get away!" item = /obj/item/reagent_containers/glass/bottle/thermite - price_min = 100 - price_max = 600 + price_min = 75 + price_max = 300 stock_max = 10 availability_prob = 50 @@ -58,7 +91,7 @@ item = /obj/item/reagent_containers/glass/chem_jug/thermite price_min = 400 - price_max = 1500 + price_max = 1200 stock_max = 3 availability_prob = 20 @@ -80,7 +113,8 @@ price_min = 1000 price_max = 3000 stock = 1 - availability_prob = 20 + availability_prob = 10 + spawn_weighting = FALSE /datum/blackmarket_item/tool/jumpboots name = "Jump Boots" @@ -101,16 +135,7 @@ price_max = 2000 stock_max = 3 availability_prob = 30 - -/datum/blackmarket_item/tool/chem_master - name = "Chem Master Board" - desc = "A Chem Master board, capable of seperating and packaging reagents. Perfect for any aspiring at home chemist." - item = /obj/item/circuitboard/machine/chem_master - - price_min = 1000 - price_max = 3000 - stock = 1 - availability_prob = 30 + spawn_weighting = FALSE /datum/blackmarket_item/tool/rcd name = "Rapid Construction Device" @@ -128,7 +153,7 @@ item = /obj/item/attachment/silencer price_min = 100 - price_max = 700 + price_max = 300 stock_min = 3 stock_max = 6 availability_prob = 60 diff --git a/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm b/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm index 3d6b32a67569..a4c997b46078 100644 --- a/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm +++ b/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm @@ -12,19 +12,6 @@ stock_max = 7 availability_prob = 40 -/datum/blackmarket_item/weapon/shotgun_dart - name = "Shotgun Dart" - desc = "These handy darts can be filled up with any chemical and be shot with a shotgun! \ - Prank your friends by shooting them with laughter! \ - Not recommended for comercial use." - item = /obj/item/ammo_casing/shotgun/dart - - price_min = 10 - price_max = 50 - stock_min = 10 - stock_max = 60 - availability_prob = 40 - /datum/blackmarket_item/weapon/bone_spear name = "Bone Spear" desc = "Authentic tribal spear, made from real bones! A steal at any price, especially if you're a caveman." @@ -45,6 +32,15 @@ stock_max = 3 availability_prob = 50 +/datum/blackmarket_item/weapon/powerfist + name = "Powerfist" + desc = "Need a bit more... omph in your right hook? This gas operated powerfist will put you in the heavyweight." + item = /obj/item/melee/powerfist + price_min = 1500 + price_max = 4000 + stock_max = 2 + availability_prob = 50 + /datum/blackmarket_item/weapon/sabre name = "SUNS Dueling Sabre" desc = "A mastercrafted sabre formerly wielded by a SUNS academic. It's very sharp, we had to spend hours stitching our fingers back on after getting it." @@ -55,53 +51,67 @@ stock = 1 availability_prob = 25 +/datum/blackmarket_item/weapon/mag_cleaver + name = "Magnetic Cleaver" + desc = "A prototype modification to the standard crusher, featuring an energy blade rather than the standard alloy cutting edge allowing for much more devasting detonations. The guy who sold this to us disappeared the next week, but that's probably a coincidence." + item = /obj/item/kinetic_crusher/syndie_crusher + + price_min = 1750 + price_max = 3000 + stock = 2 + availability_prob = 15 + spawn_weighting = FALSE + /datum/blackmarket_item/weapon/derringer name = "Derringer" desc = "A concealable handgun small enough to hide nearly anywhere. Uses .38 revolver rounds." item = /obj/item/gun/ballistic/derringer + price_min = 100 - price_max = 500 + price_max = 300 stock_max = 6 availability_prob = 50 -/datum/blackmarket_item/weapon/golden - name = "Golden Derringer" - desc = "A rare custom-made concealable weapon designed to fire illegal .357 rounds." - item = /obj/item/gun/ballistic/derringer/gold - price_min = 1000 - price_max = 3000 +/datum/blackmarket_item/weapon/syndi_derringer + name = ".357 Derringer" + desc = "A concealable hangun with a tasteful red and black paintjob, which makes it slightly more noticable. Chambered in .357, so you actually have a chance at killing something." + item = /obj/item/gun/ballistic/derringer/traitor + pair_item = list(/datum/blackmarket_item/ammo/a357_box) + + price_min = 300 + price_max = 800 + stock = 2 + availability_prob = 30 + +/datum/blackmarket_item/weapon/disposable_gun_disk + name = "Disposable Gun Design Disk" + desc = "An autolathe compatible fabrication disk for printing disposable guns chambered in .22 LR. Improper disposal or recycling of these guns is an enviromental felony misdemeanor in Solarian space. Luckily, we aren't in Solarian space, so litter all you want." + item = /obj/item/disk/design_disk/disposable_gun + + price_min = 1500 + price_max = 2500 stock = 1 availability_prob = 10 + spawn_weighting = FALSE /datum/blackmarket_item/weapon/himehabu name = "Himehabu Pistol" desc = "Great things come in small packages. The Himehabu is perfect for all your espionage needs. Chambered in .22lr." item = /obj/item/gun/ballistic/automatic/pistol/himehabu - pair_item = /datum/blackmarket_item/weapon/himehabu_mag + pair_item = list(/datum/blackmarket_item/ammo/himehabu_mag, /datum/blackmarket_item/ammo/himehabu_box) price_min = 100 price_max = 600 stock_max = 6 availability_prob = 50 -/datum/blackmarket_item/weapon/himehabu_mag - name = "Himehabu Magazines" - desc = "Compact 10 round .22lr magazines for use in the Himehabu pistol." - item = /obj/item/ammo_box/magazine/m22lr - - price_min = 100 - price_max = 200 - stock_min = 3 - stock_max = 6 - availability_prob = 0 - /datum/blackmarket_item/weapon/e10 name = "E-10 Laser Pistol" desc = "Sharplite letting you down? Try these classic Eoehoma Firearms E-10 Laser Pistols." item = /obj/item/gun/energy/laser/e10 price_min = 500 - price_max = 1250 + price_max = 1000 stock_max = 5 availability_prob = 20 @@ -119,55 +129,47 @@ name = "E-40 Hybrid Assault Rifle" desc = "A dual mode hybrid assault rifle made by the now defunct Eoehoma Firearms. Capable of firing both bullets AND lasers, for the discerning dealer in death. Chambered in Eoehoma .299 Caseless." item = /obj/item/gun/ballistic/automatic/assault/e40 - pair_item = /datum/blackmarket_item/weapon/e40_mag + pair_item = list(/datum/blackmarket_item/ammo/e40_mag) price_min = 7000 price_max = 15000 stock_max = 2 - availability_prob = 20 - -/datum/blackmarket_item/weapon/e40_mag - name = "Eoehoma .299 Caseless Magazine" - desc = "A 30 round magazine for the E-40 Hybrid Rifle." - item = /obj/item/ammo_box/magazine/e40 - - price_min = 750 - price_max = 1250 - stock_min = 2 - stock_max = 6 - availability_prob = 0 + availability_prob = 10 + spawn_weighting = FALSE /datum/blackmarket_item/weapon/e50 name = "E-50 Energy Emitter" desc = "An Eoehoma Firearms E-50 Emitter cannon. For when you want a send a message. A really big message." item = /obj/item/gun/energy/laser/e50 + pair_item = (/datum/blackmarket_item/ammo/huge_weapon_cell) price_min = 4000 price_max = 7000 stock_max = 2 availability_prob = 20 + spawn_weighting = FALSE + +/datum/blackmarket_item/weapon/e60 + name = "E-60 Disabler" + desc = "Looking for a live capture? This Eoehoma Firearms E-60 disabler will get your man." + item = /obj/item/gun/energy/disabler/e60 + + price_min = 500 + price_max = 750 + stock_max = 3 + availability_prob = 40 /datum/blackmarket_item/weapon/saber_smg name = "Saber 9mm SMG" desc = "A prototype 9mm submachine gun. Most of these never got past the RND phase and into distribution. But we happen know a guy." item = /obj/item/gun/ballistic/automatic/smg/skm_carbine/inteq/proto - pair_item = /datum/blackmarket_item/weapon/saber_mag + pair_item = list(/datum/blackmarket_item/ammo/saber_mag) - price_min = 2500 - price_max = 4200 + price_min = 2250 + price_max = 3750 stock_max = 2 availability_prob = 25 -/datum/blackmarket_item/weapon/saber_mag - name = "Saber 9mm SMG Magazines" - desc = "Magazines for use in the Saber 9mm SMG. No, they don't work as swords." - item = /obj/item/ammo_box/magazine/smgm9mm - - price_min = 500 - price_max = 1000 - stock = 2 - availability_prob = 0 - /datum/blackmarket_item/weapon/bg_16 name = "BG-16 Beam Gun" desc = "Not satisfied by Etherbor's civilian offerings? Try this military grade one we found!" @@ -184,7 +186,7 @@ item = /obj/item/gun/ballistic/rifle/illestren/sawn price_min = 600 - price_max = 1250 + price_max = 1000 stock_min = 2 stock_max = 5 availability_prob = 60 @@ -194,8 +196,8 @@ desc = "Are your arms tired from pumping Hunter's Pride shotguns? This semi-automatic combat shotgun will make killing a breeze." item = /obj/item/gun/ballistic/shotgun/automatic/combat - price_min = 2000 - price_max = 4000 + price_min = 1750 + price_max = 3500 stock_max = 3 availability_prob = 40 @@ -207,7 +209,8 @@ price_min = 1000 price_max = 2000 stock_max = 3 - availability_prob = 30 + availability_prob = 20 + spawn_weighting = FALSE /datum/blackmarket_item/weapon/mecha_syringe_gun name = "Mounted Syringe Gun" @@ -217,35 +220,25 @@ price_min = 5000 price_max = 7000 stock = 1 - availability_prob = 15 + availability_prob = 10 + spawn_weighting = FALSE /datum/blackmarket_item/weapon/mecha_hades name = "Mounted FNX-99 Carbine" desc = "This so called \"Hades\" carbine is sure to burn brightly above the competition! Not to be confused with the \"Hades\" energy rifle. Exosuit not included." item = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine - pair_item = /datum/blackmarket_item/weapon/mecha_hades_ammo + pair_item = list(/datum/blackmarket_item/ammo/mecha_hades_ammo) price_min = 2000 price_max = 3000 stock_max = 2 availability_prob = 25 -/datum/blackmarket_item/weapon/mecha_hades_ammo - name = "FNX-99 Incediary Ammo" - desc = "A box of 24 incendiary shells for the FNX-99 mounted carbine." - item = /obj/item/mecha_ammo/incendiary - - price_min = 250 - price_max = 350 - stock_min = 3 - stock_max = 5 - availability_prob = 0 - /datum/blackmarket_item/weapon/model_h name = "Model H" desc = "A Model H slug pistol. The H stands for Hurt. Chambered in ferromagnetic slugs." item = /obj/item/gun/ballistic/automatic/powered/gauss/modelh - pair_item = /datum/blackmarket_item/weapon/model_h_mag + pair_item = list(/datum/blackmarket_item/ammo/model_h_mag) price_min = 2000 price_max = 3500 @@ -257,122 +250,81 @@ /obj/item/gun/ballistic/automatic/powered/gauss/modelh)) return new model_h(loc) -/datum/blackmarket_item/weapon/model_h_mag - name = "Model H Magazine" - desc = "A 10 round magazine for Model H slug pistol." - item = /obj/item/ammo_box/magazine/modelh - - price_min = 500 - price_max = 1000 - stock_max = 4 - availability_prob = 0 - /datum/blackmarket_item/weapon/sgg name = "SSG-669C Rotary Sniper Rifle" - desc = "I could tell you it's full name, but we'd be here all day. It's a sniper rifle. It shoots people from far away. Chambered in 8x58mm." + desc = "I could tell you it's full name, but we'd be here all day. It's a sniper rifle. It shoots people from far away. Chambered in 8x58mm caseless." item = /obj/item/gun/ballistic/rifle/solgov - pair_item = /datum/blackmarket_item/weapon/sgg_stripper + pair_item = list(/datum/blackmarket_item/ammo/sgg_stripper) price_min = 3000 price_max = 6000 stock = 1 availability_prob = 20 -/datum/blackmarket_item/weapon/sgg_stripper - name = "8x58mm Stripper Clip" - desc = "A five round 8x58mm stripper clip for use with the SGG-669C." - item = /obj/item/ammo_box/a858 - - price_min = 500 - price_max = 1000 - stock_min = 4 - stock_max = 6 - availability_prob = 0 - /datum/blackmarket_item/weapon/pistole_c name = "Pistole C" desc = "Pistole Compact? Pistole Caseless? Pistole Cheese? Fuck if I know. All I know is these little numbers pack a nasty sting. Chambered in 5.56 caseless." item = /obj/item/gun/ballistic/automatic/pistol/solgov/old - pair_item = /datum/blackmarket_item/weapon/pistole_c_mag + pair_item = list(/datum/blackmarket_item/ammo/pistole_c_mag) price_min = 900 price_max = 1250 stock_max = 3 availability_prob = 30 -/datum/blackmarket_item/weapon/pistole_c_mag - name = "5.56 Caseless Magazine" - desc = "A 12 round magazine for the Pistole Cheese." - item = /obj/item/ammo_box/magazine/pistol556mm - - price_min = 250 - price_max = 750 - stock_max = 2 - availability_prob = 0 - /datum/blackmarket_item/weapon/proto_gauss name = "Prototype Gauss Rifle" desc = "A prototype gauss rifle made by Nanotrasen. Perfect for making swiss cheese out of people. Chambered in ferromagnetic pellets." item = /obj/item/gun/ballistic/automatic/powered/gauss - pair_item = /datum/blackmarket_item/weapon/proto_gauss_mag + pair_item = list(/datum/blackmarket_item/ammo/proto_gauss_mag) - price_min = 3500 - price_max = 6000 + price_min = 2500 + price_max = 4000 stock = 2 availability_prob = 25 -/datum/blackmarket_item/weapon/proto_gauss_mag - name = "Prototype Gauss Rifle Magazine" - desc = "A 25 round ferromagnetic pellet magazine for the prototype gauss rifle." - item = /obj/item/ammo_box/magazine/gauss - - price_min = 600 - price_max = 1100 - stock_min = 2 - stock_max = 4 - availability_prob = 0 - /datum/blackmarket_item/weapon/tec name = "TEC-9 Machine Pistol" desc = "Hallelujah! It's raining lead! This 9mm machine pistol is capable of spitting out bullets at rapid pace." item = /obj/item/gun/ballistic/automatic/pistol/tec9 - pair_item = /datum/blackmarket_item/weapon/tec_mag + pair_item = list(/datum/blackmarket_item/ammo/tec_mag) price_min = 1500 price_max = 2750 - stock_max = 2 + stock = 2 availability_prob = 35 -/datum/blackmarket_item/weapon/tec_mag - name = "TEC-9 AP Magazine" - desc = "A 20 round magazine of AP ammo for the TEC-9 machine pistol." - item = /obj/item/ammo_box/magazine/tec9 +/datum/blackmarket_item/weapon/syringe_gun + name = "Dart Pistol" + desc = "A compact dart pistol, for clandestine poisoining from a distance." + item = /obj/item/gun/syringe/syndicate - price_min = 600 - price_max = 1000 - stock_max = 2 - availability_prob = 0 + price_min = 750 + price_max = 1500 + stock = 2 + availability_prob = 30 -/datum/blackmarket_item/weapon/scout - name = "HP Scout" - desc = "A scoped rifle chambered in .300 Magnum. As the name would imply, perfect for scouts. Try not to tunnel vision with the scope like the last guy." - item = /obj/item/gun/ballistic/rifle/scout - pair_item = /datum/blackmarket_item/weapon/scout_stripper +/datum/blackmarket_item/weapon/polymer + name = "Polymer Survivor Rifle" + desc = "A slapdash rifle held together by spite, dreams and a good helping of duct tape. Chambered in 7.62x40mm CLIP." + item = /obj/item/gun/ballistic/rifle/polymer + pair_item = list(/datum/blackmarket_item/ammo/polymer_clip) - price_min = 4000 - price_max = 6500 - stock = 1 - availability_prob = 20 + price_min = 600 + price_max = 1250 + stock_min = 2 + stock_max = 4 + availability_prob = 50 -/datum/blackmarket_item/weapon/scout_stripper - name = ".300 Magnum Stripper Clip" - desc = "A 5 round .300 Magnum stripper clips for use with the HP Scout." - item = /obj/item/ammo_box/a300 +/datum/blackmarket_item/weapon/skm_carbine + name = "SKM-24v Carbine" + desc = "Technically this is just a sawn down SKM-24 assault rifle, but what's CLIP going to do? Sue us? Chambered in 4.6x30mm." + item = /obj/item/gun/ballistic/automatic/smg/skm_carbine + pair_item = list(/datum/blackmarket_item/ammo/carbine_mag) - price_min = 500 - price_max = 1000 - stock_min = 4 - stock_max = 6 - availability_prob = 0 + price_min = 3000 + price_max = 4500 + stock_max = 2 + availability_prob = 20 diff --git a/code/modules/cargo/blackmarket/blackmarket_market.dm b/code/modules/cargo/blackmarket/blackmarket_market.dm index 3e055048a85b..5b0c2365b3df 100644 --- a/code/modules/cargo/blackmarket/blackmarket_market.dm +++ b/code/modules/cargo/blackmarket/blackmarket_market.dm @@ -12,11 +12,37 @@ /// Item categories available from this market, only items which are in these categories can be gotten from this market. var/list/categories = list() +/datum/blackmarket_market/New() + . = ..() + addtimer(CALLBACK(src, PROC_REF(cycle_stock)), 60 MINUTES, TIMER_STOPPABLE|TIMER_LOOP|TIMER_DELETE_ME) + +/datum/blackmarket_market/proc/cycle_stock() + var/list/pair_items_to_handle = list() + + for(var/category in available_items) + for(var/item in available_items[category]) + if(istype(item, /datum/blackmarket_item)) + var/datum/blackmarket_item/b_item = item + b_item.cycle() + if(b_item.available == TRUE) + for(var/paired_item in b_item.pair_item) + var/datum/blackmarket_item/item_to_set = get_item_in_market(paired_item) + if(!(item_to_set in pair_items_to_handle) && !isnull(item_to_set)) + pair_items_to_handle += item_to_set + + for(var/item in pair_items_to_handle) + var/datum/blackmarket_item/b_item = item + b_item.cycle(TRUE,FALSE,FALSE,TRUE) + +// returns the blackmarket_item datum currently in the availible items list. Null if not in the list +/datum/blackmarket_market/proc/get_item_in_market(datum/blackmarket_item/item) + for(var/item_to_find in available_items[item.category]) + if(istype(item_to_find,item)) + return item_to_find + return null + /// Adds item to the available items and add it's category if it is not in categories yet. /datum/blackmarket_market/proc/add_item(datum/blackmarket_item/item, paired) - if(!prob(initial(item.availability_prob)) && !paired) - return FALSE - if(ispath(item)) item = new item() @@ -26,8 +52,10 @@ available_items[item.category] += item - if(item.pair_item) - add_item(item.pair_item, TRUE) + if(prob(initial(item.availability_prob)) || paired) + item.available = TRUE + else + item.available = FALSE return TRUE @@ -52,5 +80,6 @@ /datum/blackmarket_market/blackmarket name = "Black Market" - shipping = list(SHIPPING_METHOD_LTSRBT =50, - SHIPPING_METHOD_LAUNCH =10) + shipping = list(SHIPPING_METHOD_LTSRBT =100, + SHIPPING_METHOD_LAUNCH =10, + SHIPPING_METHOD_DEAD_DROP = 20) diff --git a/code/modules/cargo/blackmarket/blackmarket_telepad.dm b/code/modules/cargo/blackmarket/blackmarket_telepad.dm index 14211cad6878..bd8ec96e80b0 100644 --- a/code/modules/cargo/blackmarket/blackmarket_telepad.dm +++ b/code/modules/cargo/blackmarket/blackmarket_telepad.dm @@ -3,11 +3,8 @@ icon_state = "bluespacearray" build_path = /obj/machinery/ltsrbt req_components = list( - /obj/item/stack/ore/bluespace_crystal = 2, - /obj/item/stock_parts/subspace/ansible = 1, /obj/item/stock_parts/micro_laser = 1, /obj/item/stock_parts/scanning_module = 2) - def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial) /obj/machinery/ltsrbt name = "Long-To-Short-Range-Bluespace-Transciever" @@ -121,3 +118,17 @@ if(queue.len) recieving = pick_n_take(queue) + +/datum/crafting_recipe/blackmarket_telepad + name = "Black Market LTRSBT Board" + result = /obj/item/circuitboard/machine/ltsrbt + time = 30 + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER, TOOL_MULTITOOL) + reqs = list( + /obj/item/stack/ore/bluespace_crystal = 2, + /obj/item/stack/tape/industrial = 5, + /obj/item/card/bank = 1, + /obj/item/computer_hardware/network_card = 1, + /obj/item/circuitboard = 1 + ) + category = CAT_MISC diff --git a/code/modules/cargo/blackmarket/blackmarket_uplink.dm b/code/modules/cargo/blackmarket/blackmarket_uplink.dm index 26363bf71b82..2d25c9c444f4 100644 --- a/code/modules/cargo/blackmarket/blackmarket_uplink.dm +++ b/code/modules/cargo/blackmarket/blackmarket_uplink.dm @@ -82,13 +82,14 @@ if(viewing_category && market) if(market.available_items[viewing_category]) for(var/datum/blackmarket_item/I in market.available_items[viewing_category]) - data["items"] += list(list( - "id" = I.type, - "name" = I.name, - "cost" = I.price, - "amount" = I.unlimited ? "INF" : I.stock, - "desc" = I.desc || I.name - )) + if(I.available) + data["items"] += list(list( + "id" = I.type, + "name" = I.name, + "cost" = I.price, + "amount" = I.unlimited ? "INF" : I.stock, + "desc" = I.desc || I.name + )) return data /obj/item/blackmarket_uplink/ui_static_data(mob/user) diff --git a/code/modules/cargo/packs/machinery.dm b/code/modules/cargo/packs/machinery.dm index f25e4818329e..6e5a12f30f5b 100644 --- a/code/modules/cargo/packs/machinery.dm +++ b/code/modules/cargo/packs/machinery.dm @@ -168,18 +168,6 @@ crate_name = "holofield generator crate" crate_type = /obj/structure/closet/crate/engineering -/datum/supply_pack/machinery/blackmarket_telepad - name = "Black Market LTSRBT" - desc = "Need a faster and better way of transporting your illegal goods from and to the sector? Fear not, the Long-To-Short-Range-Bluespace-Transceiver (LTSRBT for short) is here to help. Contains a LTSRBT circuit, two bluespace crystals, and one ansible." - cost = 1000 - contains = list( - /obj/item/circuitboard/machine/ltsrbt, - /obj/item/stack/ore/bluespace_crystal/artificial, - /obj/item/stack/ore/bluespace_crystal/artificial, - /obj/item/stock_parts/subspace/ansible - ) - crate_type = /obj/structure/closet/crate/science - /datum/supply_pack/machinery/shuttle_in_a_box name = "Shuttle in a Box" desc = "The bare minimum amount of machine and computer boards required to create a working spacecraft." diff --git a/code/modules/overmap/objects/dynamic_datum.dm b/code/modules/overmap/objects/dynamic_datum.dm index dcc62aad7424..1ca28df922aa 100644 --- a/code/modules/overmap/objects/dynamic_datum.dm +++ b/code/modules/overmap/objects/dynamic_datum.dm @@ -27,6 +27,8 @@ var/ruin_type /// list of ruins and their target turf, indexed by name var/list/ruin_turfs + /// list of ruin templates currently spawned on the planet. + var/list/spawned_ruins /// Whether or not the level is currently loading. var/loading = FALSE @@ -198,6 +200,7 @@ mapzone = dynamic_encounter_values[1] reserve_docks = dynamic_encounter_values[2] ruin_turfs = dynamic_encounter_values[3] + spawned_ruins = dynamic_encounter_values[4] loading = FALSE return TRUE diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 5b841796ca91..b1847513a941 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -19,7 +19,8 @@ var/maxcharge = 1000 custom_materials = list(/datum/material/iron=700, /datum/material/glass=50) grind_results = list(/datum/reagent/lithium = 15, /datum/reagent/iron = 5, /datum/reagent/silicon = 5) - var/rigged = FALSE // true if rigged to explode + var/rigged = FALSE // true if rigged to + var/show_rigged = TRUE // whether if the cell shows it's fauly on examine. var/chargerate = 100 //how much power is given every tick in a recharger var/self_recharge = 0 //does it self recharge, over time, or not? var/ratingdesc = TRUE @@ -97,7 +98,7 @@ /obj/item/stock_parts/cell/examine(mob/user) . = ..() - if(rigged) + if(rigged && show_rigged) . += "This power cell seems to be faulty!" else . += "The charge meter reads [round(src.percent())]%." diff --git a/code/modules/reagents/reagent_containers/jug.dm b/code/modules/reagents/reagent_containers/jug.dm index 80ebcbb4d5b3..46c5620ecb20 100644 --- a/code/modules/reagents/reagent_containers/jug.dm +++ b/code/modules/reagents/reagent_containers/jug.dm @@ -143,3 +143,8 @@ /obj/item/reagent_containers/glass/chem_jug/thermite name = "chemical jug (thermite)" list_reagents = list(/datum/reagent/thermite = 150) + +/obj/item/reagent_containers/glass/chem_jug/hexacrete + name = "chemical jug (hexacrete)" + list_reagents = list(/datum/reagent/concrete/hexacrete = 150) + diff --git a/shiptest.dme b/shiptest.dme index 170e7b91ea81..55ad11a800d5 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1900,11 +1900,13 @@ #include "code\modules\cargo\blackmarket\blackmarket_market.dm" #include "code\modules\cargo\blackmarket\blackmarket_telepad.dm" #include "code\modules\cargo\blackmarket\blackmarket_uplink.dm" +#include "code\modules\cargo\blackmarket\blackmarket_items\ammo.dm" #include "code\modules\cargo\blackmarket\blackmarket_items\clothing.dm" #include "code\modules\cargo\blackmarket\blackmarket_items\consumables.dm" #include "code\modules\cargo\blackmarket\blackmarket_items\emergency.dm" #include "code\modules\cargo\blackmarket\blackmarket_items\explosives.dm" #include "code\modules\cargo\blackmarket\blackmarket_items\misc.dm" +#include "code\modules\cargo\blackmarket\blackmarket_items\tech.dm" #include "code\modules\cargo\blackmarket\blackmarket_items\tools.dm" #include "code\modules\cargo\blackmarket\blackmarket_items\weapons.dm" #include "code\modules\cargo\bounties\assistant.dm" diff --git a/tgui/packages/tgui/interfaces/BlackMarketUplink.js b/tgui/packages/tgui/interfaces/BlackMarketUplink.js index 2c4a05d09ef5..9fff7cff715f 100644 --- a/tgui/packages/tgui/interfaces/BlackMarketUplink.js +++ b/tgui/packages/tgui/interfaces/BlackMarketUplink.js @@ -23,7 +23,7 @@ export const BlackMarketUplink = (props, context) => { viewing_category, } = data; return ( - +