diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 793e7b6b2f35..f36441d0a5f9 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -200,6 +200,10 @@ #define TRAIT_TOOL_SIMPLE_BLOWTORCH "t_tool_simple_blowtorch" #define TRAIT_TOOL_PEN "t_tool_pen" + +/// Can lockout blackmarket from ASRS console circuits. +#define TRAIT_TOOL_TRADEBAND "t_tool_tradeband" + // CLOTHING TRAITS #define TRAIT_CLOTHING_HOOD "t_clothing_hood" diff --git a/code/datums/emergency_calls/emergency_call.dm b/code/datums/emergency_calls/emergency_call.dm index 390a8cfd5d61..6533086d98f3 100644 --- a/code/datums/emergency_calls/emergency_call.dm +++ b/code/datums/emergency_calls/emergency_call.dm @@ -91,12 +91,12 @@ else return chosen_call -/datum/game_mode/proc/get_specific_call(call_name, announce = TRUE, is_emergency = TRUE, info = "", announce_dispatch_message = TRUE) +/datum/game_mode/proc/get_specific_call(call_name, quiet_launch = FALSE, announce = TRUE, is_emergency = TRUE, info = "", announce_dispatch_message = TRUE) for(var/datum/emergency_call/E in all_calls) //Loop through all potential candidates if(E.name == call_name) var/datum/emergency_call/em_call = new E.type() em_call.objective_info = info - em_call.activate(announce, is_emergency, announce_dispatch_message) + em_call.activate(quiet_launch, announce, is_emergency, announce_dispatch_message) return error("get_specific_call could not find emergency call '[call_name]'") return @@ -192,7 +192,7 @@ else to_chat(src, SPAN_WARNING("You did not get enlisted in the response team. Better luck next time!")) -/datum/emergency_call/proc/activate(announce = TRUE, turf/override_spawn_loc, announce_dispatch_message = TRUE) +/datum/emergency_call/proc/activate(quiet_launch = FALSE, announce = TRUE, turf/override_spawn_loc, announce_dispatch_message = TRUE) set waitfor = 0 if(!SSticker.mode) //Something horribly wrong with the gamemode ticker return @@ -202,12 +202,12 @@ show_join_message() //Show our potential candidates the message to let them join. message_admins("Distress beacon: '[name]' activated [src.hostility? "[SPAN_WARNING("(THEY ARE HOSTILE)")]":"(they are friendly)"]. Looking for candidates.") - if(announce) + if(!quiet_launch) marine_announcement("A distress beacon has been launched from the [MAIN_SHIP_NAME].", "Priority Alert", 'sound/AI/distressbeacon.ogg', logging = ARES_LOG_SECURITY) - addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/emergency_call, spawn_candidates), announce, override_spawn_loc, announce_dispatch_message), 30 SECONDS) + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/emergency_call, spawn_candidates), quiet_launch, announce, override_spawn_loc, announce_dispatch_message), 30 SECONDS) -/datum/emergency_call/proc/spawn_candidates(announce = TRUE, override_spawn_loc, announce_dispatch_message = TRUE) +/datum/emergency_call/proc/spawn_candidates(quiet_launch = FALSE, announce = TRUE, override_spawn_loc, announce_dispatch_message = TRUE) if(SSticker.mode) SSticker.mode.picked_calls -= src @@ -218,7 +218,7 @@ members = list() //Empty the members list. candidates = list() - if(announce) + if(!quiet_launch) marine_announcement("The distress signal has not received a response, the launch tubes are now recalibrating.", "Distress Beacon", logging = ARES_LOG_SECURITY) return diff --git a/code/datums/emergency_calls/inspection.dm b/code/datums/emergency_calls/inspection.dm index 72926666ace5..4c33d7d9bfa3 100644 --- a/code/datums/emergency_calls/inspection.dm +++ b/code/datums/emergency_calls/inspection.dm @@ -263,3 +263,44 @@ to_chat(M, SPAN_BOLD("The laws of arth stretch beyond the Sol. Where others fall to corruption, you stay steadfast in your morals.")) to_chat(M, SPAN_BOLD("Corporate Officers chase after paychecks and promotions, but you are motivated to do your sworn duty and care for the population, no matter how far or isolated a colony may be.")) to_chat(M, SPAN_BOLD("Despite being stretched thin, the stalwart oath of the Marshals has continued to keep communities safe, with the CMB well respected by many. You are a representation of that oath, serve with distinction.")) + +/datum/emergency_call/inspection_cmb/black_market + name = "Inspection - Colonial Marshal Ledger Investigation Team" + mob_max = 3 //Marshal, Deputy, ICC CL + mob_min = 2 + shuttle_id = "Distress_PMC" + + max_synths = 0 + will_spawn_icc_liaison = TRUE + will_spawn_cmb_observer = FALSE + +/datum/emergency_call/inspection_cmb/black_market/New() + ..() + dispatch_message = "Third Fleet High Command to [MAIN_SHIP_NAME], we have received inconsistent supply manifests and irregularities on the ASRS system aboard your ship, and have requested a CMB Investigation Team to board and clear you of any wrongdoing." + arrival_message = "Incoming Transmission: [MAIN_SHIP_NAME], this is Anchorpoint Station with the Colonial Marshal Bureau. Be advised, we are dispatching a team of Marshals to board with you by request of GSO-91. Submitting authorized docking clearances, over." + objectives = "Investigate the inconsistencies aboard the [MAIN_SHIP_NAME]'s ASRS. In the case of illegal activity, collect evidence, and submit a report to the CMB Command at Anchorpoint Station. If required, the ICC Liaison's Tradeband is capable of fixing ASRS computers. Work with the [MAIN_SHIP_NAME]'s military police force." + +/datum/emergency_call/inspection_cmb/black_market/create_member(datum/mind/current_mind, turf/override_spawn_loc) + var/turf/spawn_loc = override_spawn_loc ? override_spawn_loc : get_spawn_point() + + if(!istype(spawn_loc)) + return //Didn't find a useable spawn point. + + var/mob/living/carbon/human/mob = new(spawn_loc) + current_mind.transfer_to(mob, TRUE) + + if(!leader && HAS_FLAG(mob?.client.prefs.toggles_ert, PLAY_LEADER) && check_timelock(mob.client, JOB_SQUAD_LEADER, time_required_for_job)) + leader = mob + to_chat(mob, SPAN_ROLE_HEADER("You are the Colonial Marshal!")) + arm_equipment(mob, /datum/equipment_preset/cmb/leader, TRUE, TRUE) + else if(!icc_liaison && will_spawn_icc_liaison && check_timelock(mob.client, JOB_CORPORATE_LIAISON, time_required_for_job)) + icc_liaison = mob + to_chat(mob, SPAN_ROLE_HEADER("You are a CMB-attached Interstellar Commerce Commission Liaison!")) + arm_equipment(mob, /datum/equipment_preset/cmb/liaison/black_market, TRUE, TRUE) //ICC CL gets a custom item + else + to_chat(mob, SPAN_ROLE_HEADER("You are a CMB Deputy!")) + arm_equipment(mob, /datum/equipment_preset/cmb/standard, TRUE, TRUE) + + print_backstory(mob) + + addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(to_chat), mob, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) diff --git a/code/datums/skills.dm b/code/datums/skills.dm index f80b391123f2..585fdc699cda 100644 --- a/code/datums/skills.dm +++ b/code/datums/skills.dm @@ -293,6 +293,16 @@ CIVILIAN SKILL_INTEL = SKILL_INTEL_EXPERT, ) +/datum/skills/civilian/icc_investigation + name = "ICC CL - Black Market ERT" + skills = list( + SKILL_CQC = SKILL_CQC_DEFAULT, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, //The ASRS consoles + SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, + SKILL_POLICE = SKILL_POLICE_SKILLED, //The CMB Tradeband Compliance Device + ) + /datum/skills/civilian/manager/director name = "Weyland-Yutani Director" skills = list( diff --git a/code/datums/supply_packs/_supply_packs.dm b/code/datums/supply_packs/_supply_packs.dm index 8f38c6151589..061779d9e5ce 100644 --- a/code/datums/supply_packs/_supply_packs.dm +++ b/code/datums/supply_packs/_supply_packs.dm @@ -23,6 +23,8 @@ var/iteration_needed = 0 /// How many W-Y dollars are deducted from the supply controller. Only use for contraband. var/dollar_cost = 0 + /// How much "heat" this crate adds, too much heat will send an investigation. Only use for contraband. + var/crate_heat = 0 /datum/supply_packs/New() if(randomised_num_contained) diff --git a/code/datums/supply_packs/black_market.dm b/code/datums/supply_packs/black_market.dm index 1737a66e85a9..0709811195b4 100644 --- a/code/datums/supply_packs/black_market.dm +++ b/code/datums/supply_packs/black_market.dm @@ -16,7 +16,7 @@ black market prices are NOT based on real or in-universe costs. they are based o */ -/datum/supply_packs/contraband//base +/datum/supply_packs/contraband //base name = "contraband crate" contains = null containertype = null @@ -25,6 +25,7 @@ black market prices are NOT based on real or in-universe costs. they are based o contraband = TRUE cost = 0 dollar_cost = 50 + crate_heat = 5 /obj/structure/largecrate/black_market /// Wipes points from objects inside to avoid infinite farming. @@ -68,11 +69,13 @@ Non-USCM items, from CLF, UPP, colonies, etc. Mostly combat-related. contains = list(/obj/item/device/black_market_scanner) containername = "trash cart" dollar_cost = 5 + crate_heat = 0 containertype = /obj/structure/closet/crate/trashcart /datum/supply_packs/contraband/seized/confiscated_equipment name = "seized foreign equipment crate" dollar_cost = 70 + crate_heat = 10 containertype = /obj/structure/largecrate/black_market/confiscated_equipment /obj/structure/largecrate/black_market/confiscated_equipment/Initialize() @@ -115,6 +118,7 @@ Non-USCM items, from CLF, UPP, colonies, etc. Mostly combat-related. name = "seized foreign weaponry crate" contains = list() dollar_cost = 45 + crate_heat = 15 containertype = /obj/structure/largecrate/black_market/confiscated_weaponry /obj/structure/largecrate/black_market/confiscated_weaponry/Initialize() @@ -413,6 +417,7 @@ Additionally, weapons that are way too good to put in the basically-flavor black /obj/item/ammo_magazine/pistol/holdout, ) dollar_cost = 5 + crate_heat = 2 containertype = /obj/structure/largecrate/black_market /datum/supply_packs/contraband/seized/bizon @@ -527,6 +532,7 @@ Primarily made up of things that would be best utilized, well, shipside. Recreat /obj/item/reagent_container/food/drinks/bottle/beer/craft/mono, ) dollar_cost = 35 + crate_heat = -5 containertype = /obj/structure/largecrate/black_market /datum/supply_packs/contraband/shipside/confiscated_medicine @@ -541,6 +547,7 @@ Primarily made up of things that would be best utilized, well, shipside. Recreat /obj/item/storage/pill_bottle/paracetamol, ) dollar_cost = 25 + crate_heat = 3 containertype = /obj/structure/largecrate/black_market /datum/supply_packs/contraband/shipside/confiscated_cuisine @@ -582,6 +589,7 @@ Primarily made up of things that would be best utilized, well, shipside. Recreat /obj/item/reagent_container/food/condiment/hotsauce/franks/macho, ) dollar_cost = 15 + crate_heat = -5 containertype = /obj/structure/largecrate/black_market @@ -598,6 +606,7 @@ Primarily made up of things that would be best utilized, well, shipside. Recreat /obj/item/storage/fancy/cigar/tarbacktube, ) dollar_cost = 45 + crate_heat = -5 containertype = /obj/structure/largecrate/black_market /datum/supply_packs/contraband/shipside/confiscated_miscellaneous @@ -622,7 +631,6 @@ Primarily made up of things that would be best utilized, well, shipside. Recreat /obj/item/explosive/grenade/smokebomb, /obj/item/corncob, /obj/item/poster, - /obj/item/weapon/banhammer, /obj/item/toy/prize/ripley, /obj/item/toy/prize/fireripley, /obj/item/toy/prize/deathripley, @@ -639,6 +647,7 @@ Primarily made up of things that would be best utilized, well, shipside. Recreat /obj/item/pamphlet/language/spanish, ) dollar_cost = 30 + crate_heat = -2 containertype = /obj/structure/largecrate/black_market @@ -659,6 +668,7 @@ USCM spare items, miscellaneous gear that's too niche and distant (or restricted name = "surplus USCM poncho crate (x2)" dollar_cost = 15 containertype = /obj/structure/largecrate/black_market/poncho + crate_heat = -2 /obj/structure/largecrate/black_market/poncho/Initialize() . = ..() @@ -671,6 +681,7 @@ USCM spare items, miscellaneous gear that's too niche and distant (or restricted /datum/supply_packs/contraband/surplus/uscm_heap name = "surplus high-explosive armor-piercing M41A magazine crate (x3)" dollar_cost = 40 + crate_heat = -2 containertype = /obj/structure/largecrate/black_market/uscm_heap /obj/structure/largecrate/black_market/uscm_heap/Initialize() @@ -715,6 +726,7 @@ USCM spare items, miscellaneous gear that's too niche and distant (or restricted name = "surplus magazine box (Ext M4RA x 12)" contains = list(/obj/item/ammo_box/magazine/m4ra/ext) dollar_cost = 45 + crate_heat = 3 containertype = /obj/structure/largecrate/black_market /* - Misc. USCM weaponry - */ @@ -761,14 +773,13 @@ This is where the RO can reclaim their lost honor and purchase the M44 custom, t /datum/supply_packs/contraband/deep_storage group = "Deep Storage" - - -// Helmet Garb + crate_heat = -5 /datum/supply_packs/contraband/deep_storage/spacejam name = "Tickets to Space Jam" contains = list(/obj/item/prop/helmetgarb/spacejam_tickets) dollar_cost = 5 + crate_heat = -2 containertype = /obj/structure/largecrate/black_market /datum/supply_packs/contraband/deep_storage/broken_nvgs @@ -923,6 +934,7 @@ This is where the RO can reclaim their lost honor and purchase the M44 custom, t name = "Frozen Lime" contains = list(/obj/item/reagent_container/food/snacks/grown/lime) dollar_cost = 5 + crate_heat = -2 containertype = /obj/structure/largecrate/black_market /datum/supply_packs/contraband/deep_storage/uno_reverse_random @@ -961,18 +973,21 @@ This is where the RO can reclaim their lost honor and purchase the M44 custom, t name = "D18 Holdout Pistol" contains = list(/obj/item/storage/box/clf) dollar_cost = 10 + crate_heat = 2 containertype = /obj/structure/largecrate/black_market /datum/supply_packs/contraband/deep_storage/m4a3_c name = "M4A3 Custom Pistol" contains = list(/obj/item/weapon/gun/pistol/m4a3/custom) dollar_cost = 35 + crate_heat = 4 containertype = /obj/structure/largecrate/black_market /datum/supply_packs/contraband/deep_storage/m44_c name = "M44 Custom Revolver" contains = list(/obj/item/weapon/gun/revolver/m44/custom) dollar_cost = 70 + crate_heat = 4 containertype = /obj/structure/largecrate/black_market /* --- MISCELLANEOUS --- */ @@ -989,6 +1004,7 @@ Things that don't fit anywhere else. If they're meant for shipside use, they pro /datum/supply_packs/contraband/miscellaneous/secured_wildlife name = "secured wildlife container" dollar_cost = 45 + crate_heat = 7 containertype = /obj/structure/largecrate/black_market/secured_wildlife /obj/structure/largecrate/black_market/secured_wildlife @@ -1007,6 +1023,7 @@ Things that don't fit anywhere else. If they're meant for shipside use, they pro /datum/supply_packs/contraband/miscellaneous/potted_plant name = "potted plant crate" dollar_cost = 50 + crate_heat = -10 contains = list(/obj/structure/flora/pottedplant/random/unanchored) containertype = /obj/structure/largecrate/black_market @@ -1019,6 +1036,7 @@ Things that don't fit anywhere else. If they're meant for shipside use, they pro /datum/supply_packs/contraband/miscellaneous/clf_supplies name = "unmarked CLF supply crate" dollar_cost = 40 + crate_heat = 25 contains = list() containertype = /obj/structure/largecrate/black_market/clf_supplies diff --git a/code/game/gamemodes/colonialmarines/colonialmarines.dm b/code/game/gamemodes/colonialmarines/colonialmarines.dm index cf2b7819a596..258a1a962713 100644 --- a/code/game/gamemodes/colonialmarines/colonialmarines.dm +++ b/code/game/gamemodes/colonialmarines/colonialmarines.dm @@ -265,7 +265,7 @@ continue if(groundside_humans > (groundside_xenos * GROUNDSIDE_XENO_MULTIPLIER)) - SSticker.mode.get_specific_call("Xenomorphs Groundside (Forsaken)", FALSE, FALSE, announce_dispatch_message = FALSE) + SSticker.mode.get_specific_call("Xenomorphs Groundside (Forsaken)", TRUE, FALSE, FALSE, announce_dispatch_message = FALSE) TIMER_COOLDOWN_START(src, COOLDOWN_HIJACK_GROUND_CHECK, 1 MINUTES) diff --git a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm index e172939c847f..3d856f35ce77 100644 --- a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm +++ b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm @@ -193,7 +193,7 @@ announce_xeno_wave(wave) if(xeno_wave == 7) //Wave when Marines get reinforcements! - get_specific_call("Marine Reinforcements (Squad)", TRUE, FALSE) + get_specific_call("Marine Reinforcements (Squad)", FALSE, TRUE, FALSE) xeno_wave = min(xeno_wave + 1, WO_MAX_WAVE) diff --git a/code/game/objects/effects/spawners/random.dm b/code/game/objects/effects/spawners/random.dm index 77390d533c9e..450981377a73 100644 --- a/code/game/objects/effects/spawners/random.dm +++ b/code/game/objects/effects/spawners/random.dm @@ -206,7 +206,6 @@ /obj/item/poster,\ /obj/item/toy/bikehorn,\ /obj/item/toy/beach_ball,\ - /obj/item/weapon/banhammer,\ /obj/item/toy/balloon,\ /obj/item/toy/blink,\ /obj/item/toy/crossbow,\ diff --git a/code/game/objects/items/circuitboards/computer.dm b/code/game/objects/items/circuitboards/computer.dm index d754ada57ca1..db19b79ac0fd 100644 --- a/code/game/objects/items/circuitboards/computer.dm +++ b/code/game/objects/items/circuitboards/computer.dm @@ -158,18 +158,25 @@ name = "Circuit board (ASRS console)" build_path = /obj/structure/machinery/computer/supplycomp - var/contraband_enabled = 0 + var/contraband_enabled = FALSE + var/black_market_lock = FALSE /obj/item/circuitboard/computer/supplycomp/construct(obj/structure/machinery/computer/supplycomp/SC) if (..(SC)) SC.toggle_contraband(contraband_enabled) + SC.lock_black_market(black_market_lock) /obj/item/circuitboard/computer/supplycomp/disassemble(obj/structure/machinery/computer/supplycomp/SC) + if(SC.can_order_contraband) + contraband_enabled = TRUE + if(SC.black_market_lockout) + black_market_lock = TRUE if (..(SC)) SC.toggle_contraband(contraband_enabled) + SC.lock_black_market(black_market_lock) -/obj/item/circuitboard/computer/supplycomp/attackby(obj/item/multitool, mob/user) - if(HAS_TRAIT(multitool, TRAIT_TOOL_MULTITOOL)) +/obj/item/circuitboard/computer/supplycomp/attackby(obj/item/tool, mob/user) + if(HAS_TRAIT(tool, TRAIT_TOOL_MULTITOOL)) to_chat(user, SPAN_WARNING("You start messing around with the electronics of \the [src]...")) if(do_after(user, 8 SECONDS, INTERRUPT_ALL, BUSY_ICON_FRIENDLY)) if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) @@ -178,11 +185,40 @@ to_chat(user, SPAN_WARNING("Huh? You find a processor bus with the letters 'B.M.' written in white crayon over it. You start fiddling with it.")) if(do_after(user, 8 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE)) if(!contraband_enabled) - to_chat(user, SPAN_WARNING("You amplify the broadcasting function with \the [multitool], and a red light starts blinking on and off on the board. Put it back in?")) + to_chat(user, SPAN_WARNING("You amplify the broadcasting function with \the [tool], and a red light starts blinking on and off on the board. Put it back in?")) contraband_enabled = TRUE else - to_chat(user, SPAN_WARNING("You weaken the broadcasting function with \the [multitool], and the red light stops blinking, turning off. It's probably good now.")) + to_chat(user, SPAN_WARNING("You weaken the broadcasting function with \the [tool], and the red light stops blinking, turning off. It's probably good now.")) contraband_enabled = FALSE + + if(HAS_TRAIT(tool, TRAIT_TOOL_TRADEBAND)) + + if(!skillcheck(user, SKILL_POLICE, SKILL_POLICE_SKILLED)) + to_chat(user, SPAN_NOTICE("You do not know how to use [tool]")) + return + + if(black_market_lock) + to_chat(user, SPAN_NOTICE("[src] has already been reset.")) + return + + if(user.action_busy) + to_chat(user, "You are too busy with other actions to fix any tampering.") + return + + playsound(tool, 'sound/machines/lockenable.ogg', 25) + user.visible_message(SPAN_NOTICE("[user] attaches [tool] to [src]."),\ + SPAN_NOTICE("You begin to fix any tampering to [src].")) + tool.icon_state = "[tool.icon_state]_on" + + if(!do_after(user, 15 SECONDS, INTERRUPT_ALL, BUSY_ICON_GENERIC, tool, INTERRUPT_ALL)) + tool.icon_state = initial(tool.icon_state) + return + + playsound(tool, 'sound/machines/ping.ogg', 25) + black_market_lock = TRUE + contraband_enabled = FALSE + tool.icon_state = initial(tool.icon_state) + else ..() /obj/item/circuitboard/computer/supplycomp/vehicle diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 83976e6a9077..1deee0f2ef8a 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -456,3 +456,12 @@ FORENSIC SCANNER update_icon(market_value, TRUE) playsound(user, 'sound/machines/twobeep.ogg', 15, TRUE) to_chat(user, SPAN_NOTICE("You scan [hit_atom] and notice a reading on [src]'s pad, it says: ITEM HAS [market_value] VALUE ")) + +/obj/item/device/cmb_black_market_tradeband + name = "\improper CMB Tradeband Compliance Device" + desc = "A device used to reset any tampering done to trading devices' signal range. Occasionally used to fix any signal chips damaged in an accident, but often for malpractice in trading. Use this with caution, as it will also reset any evidence of potential illicit trade. Created to fulfill a joint-organization requirement for CMB-ICC teams on the frontier, where tampered machinery was difficult to move and refurbish. Smugglers beware." + icon_state = "cmb_scanner" + item_state = "analyzer" + w_class = SIZE_SMALL + flags_atom = FPRINT + flags_equip_slot = SLOT_WAIST diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 22a3f48c837e..3d774cedc616 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -106,7 +106,8 @@ var/datum/controller/supply/supply_controller = new() circuit = /obj/item/circuitboard/computer/supplycomp var/temp = null var/reqtime = 0 //Cooldown for requisitions - Quarxink - var/can_order_contraband = 0 + var/can_order_contraband = FALSE + var/black_market_lockout = FALSE var/last_viewed_group = "categories" var/first_time = TRUE @@ -143,6 +144,12 @@ var/datum/controller/supply/supply_controller = new() //If any computers are able to order contraband, it's enabled. Otherwise, it's disabled! +/// Prevents use of black market, even if it is otherwise enabled. If any computer has black market locked out, it applies across all of the currently established ones. +/obj/structure/machinery/computer/supplycomp/proc/lock_black_market(market_locked = FALSE) + for(var/obj/structure/machinery/computer/supplycomp/computer as anything in supply_controller.bound_supply_computer_list) + if(market_locked) + computer.black_market_lockout = TRUE + /obj/structure/machinery/computer/ordercomp name = "Supply ordering console" icon = 'icons/obj/structures/machinery/computer.dmi' @@ -373,6 +380,8 @@ var/datum/controller/supply/supply_controller = new() var/black_market_points = 5 // 5 to start with to buy the scanner. ///If the black market is enabled. var/black_market_enabled = FALSE + ///How close the CMB is to investigating | 100 sends an ERT + var/black_market_heat = 0 /// This contains a list of all typepaths of sold items and how many times they've been recieved. Used to calculate points dropoff (Can't send down a hundred blue souto cans for infinite points) var/list/black_market_sold_items @@ -953,7 +962,7 @@ var/datum/controller/supply/supply_controller = new() if(!istype(supply_pack)) return - if((supply_pack.contraband && !can_order_contraband) || !supply_pack.buyable) + if((supply_pack.contraband && !can_order_contraband) || !supply_pack.buyable || supply_pack.contraband && black_market_lockout) return var/timeout = world.time + 600 @@ -1021,12 +1030,16 @@ var/datum/controller/supply/supply_controller = new() supply_controller.requestlist.Cut(i,i+1) supply_controller.points -= round(supply_pack.cost) supply_controller.black_market_points -= round(supply_pack.dollar_cost) + if(supply_controller.black_market_heat != -1) //-1 Heat means heat is disabled + supply_controller.black_market_heat = clamp(supply_controller.black_market_heat + supply_pack.crate_heat + (supply_pack.crate_heat * rand(rand(-0.25,0),0.25)), 0, 100) // black market heat added is crate heat +- up to 25% of crate heat supply_controller.shoppinglist += supply_order supply_pack.cost = supply_pack.cost * SUPPLY_COST_MULTIPLIER temp = "Thank you for your order.
" temp += "
Back Main Menu" supply_order.approvedby = usr.name msg_admin_niche("[usr] confirmed supply order of [supply_pack.name].") + if(supply_controller.black_market_heat == 100) + supply_controller.black_market_investigation() var/pack_source = "Cargo Hold" var/pack_name = supply_pack.name if(supply_pack.dollar_cost) @@ -1094,6 +1107,9 @@ var/datum/controller/supply/supply_controller = new() temp = "W-Y Dollars: $[supply_controller.black_market_points]
" temp += "Back to all categories


" temp += SPAN_DANGER("ERR0R UNK7OWN C4T2G#!$0-


") + if(black_market_lockout) + temp += "





Unauthorized Access Removed.
This console is currently under CMB investigation.
Thank you for your cooperation.
" + return temp += "KHZKNHZH#0-" if(!supply_controller.mendoza_status) // he's daed temp += "........." @@ -1234,6 +1250,11 @@ var/datum/controller/supply/supply_controller = new() /// For code readability. addtimer(CALLBACK(GLOBAL_PROC, /proc/playsound, get_rand_sound_tile(), sound_to_play, 25, FALSE), timer) +/datum/controller/supply/proc/black_market_investigation() + black_market_heat = -1 + SSticker.mode.get_specific_call("Inspection - Colonial Marshal Ledger Investigation Team", TRUE, TRUE, FALSE) + log_game("Black Market Inspection auto-triggered.") + /obj/structure/machinery/computer/supplycomp/proc/is_buyable(datum/supply_packs/supply_pack) if(supply_pack.group != last_viewed_group) @@ -1242,7 +1263,7 @@ var/datum/controller/supply/supply_controller = new() if(!supply_pack.buyable) return - if(supply_pack.contraband && !can_order_contraband) + if(supply_pack.contraband && !can_order_contraband || supply_pack.contraband && black_market_lockout) return if(isnull(supply_pack.contains) && isnull(supply_pack.containertype)) diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm index 32eaeb674b8d..79c0a03a7589 100644 --- a/code/modules/admin/tabs/event_tab.dm +++ b/code/modules/admin/tabs/event_tab.dm @@ -284,6 +284,21 @@ if(points_to_add >= 0) shipwide_ai_announcement("Additional Supply Budget has been authorised for this operation.") +/datum/admins/proc/check_req_heat() + set name = "Check Requisitions Heat" + set desc = "Check how close the CMB is to arriving to search Requisitions." + set category = "Admin.Events" + if(!SSticker.mode || !check_rights(R_ADMIN)) + return + + var/req_heat_change = tgui_input_real_number(usr, "Set the new requisitions black market heat. ERT is called at 100, disabled at -1. Current Heat: [supply_controller.black_market_heat]", "Modify Req Heat", 0, 100, -1) + if(!req_heat_change) + return + + supply_controller.black_market_heat = req_heat_change + message_admins("[key_name_admin(usr)] set requisitions heat to [req_heat_change].") + + /datum/admins/proc/admin_force_selfdestruct() set name = "Self-Destruct" set desc = "Trigger self-destruct countdown. This should not be done if the self-destruct has already been called." @@ -687,6 +702,7 @@ Cancel Evacuation
Disable Shuttle Control
Add Requisitions Points
+ Modify Requisitions Heat

Research
Change Research Clearance
diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index d7f6d7159675..4c7e6afa5b7b 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -2096,7 +2096,7 @@ if(distress_cancel) return distress_cancel = TRUE - SSticker.mode.get_specific_call("Weyland-Yutani PMC (Chemical Investigation Squad)", FALSE, FALSE) + SSticker.mode.get_specific_call("Weyland-Yutani PMC (Chemical Investigation Squad)", TRUE, FALSE, FALSE) log_game("[key_name_admin(approver)] has sent a PMC distress beacon, requested by [key_name_admin(ref_person)]") message_admins("[key_name_admin(approver)] has sent a PMC distress beacon, requested by [key_name_admin(ref_person)]") diff --git a/code/modules/admin/topic/topic_events.dm b/code/modules/admin/topic/topic_events.dm index 3240bf947938..45d826668d4b 100644 --- a/code/modules/admin/topic/topic_events.dm +++ b/code/modules/admin/topic/topic_events.dm @@ -18,6 +18,8 @@ admin_cancel_evacuation() if("add_req_points") add_req_points() + if("check_req_heat") + check_req_heat() if("medal") owner.award_medal() if("jelly") diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index 3f0775c0b65d..d5d44a047947 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -144,6 +144,7 @@ "wylogo.png" = 'html/images/wylogo.png', "uscmlogo.png" = 'html/images/uscmlogo.png', "upplogo.png" = 'html/images/upplogo.png', + "cmblogo.png" = 'html/images/cmblogo.png', "faxwylogo.png" = 'html/images/faxwylogo.png', "faxbackground.jpg" = 'html/images/faxbackground.jpg', ) diff --git a/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm b/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm index 98736d105a83..d6c849e883af 100644 --- a/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm +++ b/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm @@ -21,4 +21,4 @@ /datum/tech/cryomarine/on_unlock() . = ..() - SSticker.mode.get_specific_call("Marine Cryo Reinforcement (Spec)", FALSE, FALSE, announce_dispatch_message = FALSE) + SSticker.mode.get_specific_call("Marine Cryo Reinforcement (Spec)", TRUE, FALSE, FALSE, announce_dispatch_message = FALSE) diff --git a/code/modules/cm_tech/techs/marine/tier3/cryorine.dm b/code/modules/cm_tech/techs/marine/tier3/cryorine.dm index 56542e0000a6..575ffe67b85b 100644 --- a/code/modules/cm_tech/techs/marine/tier3/cryorine.dm +++ b/code/modules/cm_tech/techs/marine/tier3/cryorine.dm @@ -23,4 +23,4 @@ /datum/tech/repeatable/cryomarine/on_unlock() . = ..() - SSticker.mode.get_specific_call("Marine Cryo Reinforcements (Tech)", FALSE, FALSE, announce_dispatch_message = FALSE) + SSticker.mode.get_specific_call("Marine Cryo Reinforcements (Tech)", TRUE, FALSE, FALSE, announce_dispatch_message = FALSE) diff --git a/code/modules/gear_presets/cmb.dm b/code/modules/gear_presets/cmb.dm index 9da7ba70ae5b..2c09b8c89b6d 100644 --- a/code/modules/gear_presets/cmb.dm +++ b/code/modules/gear_presets/cmb.dm @@ -344,6 +344,14 @@ new_human.equip_to_slot_or_del(new /obj/item/device/radio, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/red, WEAR_IN_BACK) +/datum/equipment_preset/cmb/liaison/black_market + name = "CMB - ICC Liaison - Black Market ERT" + skills = /datum/skills/civilian/icc_investigation + +/datum/equipment_preset/cmb/liaison/black_market/load_gear(mob/living/carbon/human/new_human) + . = ..() + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/utility/full, WEAR_WAIST) //Tool belt to open ASRS + new_human.equip_to_slot_or_del(new /obj/item/device/cmb_black_market_tradeband, WEAR_IN_BACK) //Tradeband to disable black market //*****************************************************************************************************/ diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index f78ca9ef5473..71d1090b20e0 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -257,6 +257,7 @@ t = replacetext(t, "\[wy\]", "") t = replacetext(t, "\[uscm\]", "") t = replacetext(t, "\[upp\]", "") + t = replacetext(t, "\[cmb\]", "") t = "[t]" else // If it is a crayon, and he still tries to use these, make them empty! diff --git a/code/modules/reagents/chemistry_properties/prop_special.dm b/code/modules/reagents/chemistry_properties/prop_special.dm index 7c96169d199f..640e18426311 100644 --- a/code/modules/reagents/chemistry_properties/prop_special.dm +++ b/code/modules/reagents/chemistry_properties/prop_special.dm @@ -96,7 +96,7 @@ H.contract_disease(new /datum/disease/xeno_transformation(0),1) //This is the real reason PMCs are being sent to retrieve it. /datum/chem_property/special/DNA_Disintegrating/trigger() - SSticker.mode.get_specific_call("Weyland-Yutani Goon (Chemical Investigation Squad)", FALSE, FALSE, holder.name, TRUE) + SSticker.mode.get_specific_call("Weyland-Yutani Goon (Chemical Investigation Squad)", TRUE, FALSE, FALSE, holder.name, TRUE) chemical_data.update_credits(10) message_admins("The research department has discovered DNA_Disintegrating in [holder.name] adding 10 bonus tech points.") var/datum/techtree/tree = GET_TREE(TREE_MARINE) diff --git a/html/images/cmblogo.png b/html/images/cmblogo.png new file mode 100644 index 000000000000..d324f904a4c0 Binary files /dev/null and b/html/images/cmblogo.png differ diff --git a/icons/obj/items/devices.dmi b/icons/obj/items/devices.dmi index df3a53339dc4..8bf7634a7df4 100644 Binary files a/icons/obj/items/devices.dmi and b/icons/obj/items/devices.dmi differ diff --git a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm index 631e40c22643..1ad01aa3d6bb 100644 --- a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm +++ b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm @@ -895,7 +895,6 @@ /area/shiva/interior/garage) "adp" = ( /obj/structure/closet/secure_closet/engineering_personal, -/obj/item/weapon/banhammer, /turf/open/floor/shiva{ dir = 1 },