From 3dace329be28091213da336819ad87f8424f890d Mon Sep 17 00:00:00 2001 From: shellspeed1 Date: Sat, 17 Sep 2022 19:27:40 -0700 Subject: [PATCH 01/14] adds public bounty consoles without inflation, also removes the mint --- _maps/map_files/BoxStation/BoxStation.dmm | 20 +- code/__DEFINES/economy.dm | 15 ++ code/game/machinery/civilian_bountys.dm | 225 ++++++++++++++++++ code/game/objects/items/cards_ids.dm | 5 + .../circuitboards/computer_circuitboards.dm | 4 + .../circuitboards/machine_circuitboards.dm | 18 +- code/modules/cargo/bounties/assistant.dm | 56 ++--- code/modules/cargo/bounties/botany.dm | 11 + code/modules/cargo/bounties/chef.dm | 7 + code/modules/cargo/bounties/engineering.dm | 12 + code/modules/cargo/bounties/medical.dm | 12 + code/modules/cargo/bounties/security.dm | 34 +++ code/modules/cargo/bounty.dm | 27 ++- code/modules/economy/account.dm | 43 ++++ code/modules/jobs/job_types/_job.dm | 2 + .../jobs/job_types/atmospheric_technician.dm | 1 + code/modules/jobs/job_types/bartender.dm | 1 + code/modules/jobs/job_types/botanist.dm | 1 + code/modules/jobs/job_types/chemist.dm | 1 + code/modules/jobs/job_types/chief_engineer.dm | 1 + .../jobs/job_types/chief_medical_officer.dm | 1 + code/modules/jobs/job_types/cook.dm | 1 + code/modules/jobs/job_types/geneticist.dm | 1 + .../jobs/job_types/head_of_security.dm | 2 + code/modules/jobs/job_types/medical_doctor.dm | 1 + code/modules/jobs/job_types/paramedic.dm | 1 + .../jobs/job_types/research_director.dm | 1 + code/modules/jobs/job_types/roboticist.dm | 1 + code/modules/jobs/job_types/scientist.dm | 1 + .../jobs/job_types/security_officer.dm | 1 + code/modules/jobs/job_types/shaft_miner.dm | 1 + .../jobs/job_types/station_engineer.dm | 1 + code/modules/jobs/job_types/virologist.dm | 1 + code/modules/jobs/job_types/warden.dm | 1 + code/modules/mining/mint.dm | 146 ------------ .../comp_board_designs_cargo.dm | 7 + .../machine_desings/machine_designs_cargo.dm | 7 + .../research/techweb/nodes/misc_nodes.dm | 2 +- sound/machines/wewewew.ogg | Bin 0 -> 21442 bytes tgstation.dme | 2 +- tgui/packages/tgui/interfaces/Mint.js | 48 ---- 41 files changed, 464 insertions(+), 259 deletions(-) create mode 100644 code/game/machinery/civilian_bountys.dm delete mode 100644 code/modules/mining/mint.dm create mode 100644 sound/machines/wewewew.ogg delete mode 100644 tgui/packages/tgui/interfaces/Mint.js diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index f1c58be502..b007c1a194 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -16129,11 +16129,11 @@ /area/service/bar) "aMw" = ( /obj/machinery/vending/dinnerware{ - contraband = list(/obj/item/reagent_containers/food/condiment/flour = 4); + contraband = list(/obj/item/reagent_containers/food/condiment/flour=4); desc = "This vendor is full of condiments to put on food."; name = "\improper Condiments Vendor"; product_ads = "Get your sauces here!;No slave labour was used to make these products!;Nanotrasen Approved?!"; - products = list(/obj/item/storage/bag/tray = 8, /obj/item/reagent_containers/food/drinks/drinkingglass = 10, /obj/item/storage/box/cups = 5, /obj/item/reagent_containers/food/condiment/pack/ketchup = 20, /obj/item/reagent_containers/food/condiment/pack/mustard = 20, /obj/item/reagent_containers/food/condiment/pack/hotsauce = 20, /obj/item/reagent_containers/food/condiment/pack/astrotame = 20, /obj/item/reagent_containers/food/condiment/saltshaker = 20, /obj/item/reagent_containers/food/condiment/peppermill = 20) + products = list(/obj/item/storage/bag/tray=8,/obj/item/reagent_containers/food/drinks/drinkingglass=10,/obj/item/storage/box/cups=5,/obj/item/reagent_containers/food/condiment/pack/ketchup=20,/obj/item/reagent_containers/food/condiment/pack/mustard=20,/obj/item/reagent_containers/food/condiment/pack/hotsauce=20,/obj/item/reagent_containers/food/condiment/pack/astrotame=20,/obj/item/reagent_containers/food/condiment/saltshaker=20,/obj/item/reagent_containers/food/condiment/peppermill=20) }, /turf/open/floor/wood, /area/service/bar) @@ -17889,7 +17889,7 @@ /area/service/bar) "aRA" = ( /obj/machinery/vending/dinnerware{ - contraband = list(/obj/item/kitchen/rollingpin = 2, /obj/item/kitchen/knife/butcher = 2, /obj/item/reagent_containers/food/condiment/flour = 4) + contraband = list(/obj/item/kitchen/rollingpin=2,/obj/item/kitchen/knife/butcher=2,/obj/item/reagent_containers/food/condiment/flour=4) }, /turf/open/floor/plasteel/cafeteria, /area/service/kitchen) @@ -54482,6 +54482,10 @@ }, /turf/open/floor/carpet/arcade, /area/commons/arcade) +"fCV" = ( +/obj/machinery/piratepad/civilian, +/turf/open/floor/plasteel, +/area/cargo/office) "fDn" = ( /obj/structure/table, /obj/item/trash/chips{ @@ -65860,6 +65864,12 @@ /obj/item/assembly/signaler, /turf/open/floor/plating, /area/maintenance/bar) +"wfZ" = ( +/obj/machinery/computer/piratepad_control/civilian{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/cargo/office) "wgo" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -90509,7 +90519,7 @@ boR bqs bbR bkM -bbR +fCV bwd bxB bvL @@ -90766,7 +90776,7 @@ boT bbR bbR buI -bbR +wfZ bwd bxD byL diff --git a/code/__DEFINES/economy.dm b/code/__DEFINES/economy.dm index 715469ff78..0d37607b81 100644 --- a/code/__DEFINES/economy.dm +++ b/code/__DEFINES/economy.dm @@ -52,3 +52,18 @@ #define PRICE_ABOVE_EXPENSIVE 500 // RCD, Crew pinpointer/monitor, galoshes #define PRICE_REALLY_EXPENSIVE 700 // More premium stuff. #define PRICE_ALMOST_ONE_GRAND 900 // $$$ Insulated gloves, backpack water-tank spray $$$ + +//Defines that set what kind of civilian bounties should be applied mid-round. +#define CIV_JOB_BASIC 1 +#define CIV_JOB_ROBO 2 +#define CIV_JOB_CHEF 3 +#define CIV_JOB_SEC 4 +#define CIV_JOB_DRINK 5 +#define CIV_JOB_CHEM 6 +#define CIV_JOB_VIRO 7 +#define CIV_JOB_SCI 8 +#define CIV_JOB_ENG 9 +#define CIV_JOB_MINE 10 +#define CIV_JOB_MED 11 +#define CIV_JOB_GROW 12 +#define CIV_JOB_RANDOM 13 diff --git a/code/game/machinery/civilian_bountys.dm b/code/game/machinery/civilian_bountys.dm new file mode 100644 index 0000000000..f8650625d7 --- /dev/null +++ b/code/game/machinery/civilian_bountys.dm @@ -0,0 +1,225 @@ +///Pad for the Civilian Bounty Control. +/obj/machinery/piratepad/civilian + name = "civilian bounty pad" + desc = "A machine designed to send civilian bounty targets to centcom." + layer = TABLE_LAYER + +///Computer for assigning new civilian bounties, and sending bounties for collection. +/obj/machinery/computer/piratepad_control/civilian + name = "civilian bounty control terminal" + desc = "A console for assigning civilian bounties to inserted ID cards, and for controlling the bounty pad for export." + status_report = "Ready for delivery." + icon_screen = "civ_bounty" + icon_keyboard = "id_key" + warmup_time = 3 SECONDS + var/obj/item/card/id/inserted_scan_id + +/obj/machinery/computer/piratepad_control/civilian/Initialize() + . = ..() + pad = /obj/machinery/piratepad/civilian + +/obj/machinery/computer/piratepad_control/civilian/attackby(obj/item/I, mob/living/user, params) + . = ..() + if(isidcard(I)) + if(id_insert(user, I, inserted_scan_id)) + inserted_scan_id = I + return TRUE + +/obj/machinery/computer/piratepad_control/multitool_act(mob/living/user, obj/item/multitool/I) + if(istype(I) && istype(I.buffer,/obj/machinery/piratepad/civilian)) + to_chat(user, "You link [src] with [I.buffer] in [I] buffer.") + pad = I.buffer + return TRUE + +/obj/machinery/computer/piratepad_control/civilian/LateInitialize() + . = ..() + if(cargo_hold_id) + for(var/obj/machinery/piratepad/civilian/C in GLOB.machines) + if(C.cargo_hold_id == cargo_hold_id) + pad = C + return + else + pad = locate() in range(4,src) + +/obj/machinery/computer/piratepad_control/civilian/recalc() + if(sending) + return FALSE + if(!inserted_scan_id) + status_report = "Please insert your ID first." + playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) + return FALSE + if(!inserted_scan_id.registered_account.civilian_bounty) + status_report = "Please accept a new civilian bounty first." + playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) + return FALSE + status_report = "Civilian Bounty: " + for(var/atom/movable/AM in get_turf(pad)) + if(AM == pad) + continue + if(inserted_scan_id.registered_account.civilian_bounty.applies_to(AM)) + status_report += "Target Applicable." + playsound(loc, 'sound/machines/synth_yes.ogg', 30 , TRUE) + return + status_report += "Not Applicable." + playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) + +/** + * This fully rewrites base behavior in order to only check for bounty objects, and nothing else. + */ +/obj/machinery/computer/piratepad_control/civilian/send() + playsound(loc, 'sound/machines/wewewew.ogg', 70, TRUE) + if(!sending) + return + if(!inserted_scan_id) + stop_sending() + return FALSE + if(!inserted_scan_id.registered_account.civilian_bounty) + stop_sending() + return FALSE + var/datum/bounty/curr_bounty = inserted_scan_id.registered_account.civilian_bounty + var/active_stack = 0 + for(var/atom/movable/AM in get_turf(pad)) + if(AM == pad) + continue + if(curr_bounty.applies_to(AM)) + active_stack ++ + curr_bounty.ship(AM) + qdel(AM) + if(active_stack >= 1) + status_report += "Bounty Target Found x[active_stack]. " + else + status_report = "No applicable targets found. Aborting." + stop_sending() + if(curr_bounty.can_claim()) + //Pay for the bounty with the ID's department funds. + inserted_scan_id.registered_account.transfer_money(SSeconomy.get_dep_account(inserted_scan_id.registered_account.account_job.paycheck_department), curr_bounty.reward) + status_report += "Bounty Completed! [curr_bounty.reward] credits have been paid out. " + inserted_scan_id.registered_account.reset_bounty() + pad.visible_message("[pad] activates!") + flick(pad.sending_state,pad) + pad.icon_state = pad.idle_state + playsound(loc, 'sound/machines/synth_yes.ogg', 30 , TRUE) + sending = FALSE + +/obj/machinery/computer/piratepad_control/civilian/AltClick(mob/user) + . = ..() + id_eject(user, inserted_scan_id) + +/obj/machinery/computer/piratepad_control/civilian/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "CivCargoHoldTerminal", name) + ui.open() + +/obj/machinery/computer/piratepad_control/civilian/ui_data(mob/user) + var/list/data = list() + data["points"] = points + data["pad"] = pad ? TRUE : FALSE + data["sending"] = sending + data["status_report"] = status_report + data["id_inserted"] = inserted_scan_id + if(inserted_scan_id && inserted_scan_id.registered_account) + data["id_bounty_info"] = inserted_scan_id.registered_account.bounty_text() + data["id_bounty_num"] = inserted_scan_id.registered_account.bounty_num() + data["id_bounty_value"] = inserted_scan_id.registered_account.bounty_value() + return data + +/obj/machinery/computer/piratepad_control/civilian/ui_act(action, params) + if(..()) + return + if(!pad) + return + if(!usr.canUseTopic(src, BE_CLOSE)) + return + switch(action) + if("recalc") + recalc() + if("send") + start_sending() + if("stop") + stop_sending() + if("bounty") + if(!inserted_scan_id || !inserted_scan_id.registered_account) + return + var/datum/bank_account/pot_acc = inserted_scan_id.registered_account + if(pot_acc.civilian_bounty && ((world.time) < pot_acc.bounty_timer + 5 MINUTES)) + var/curr_time = round(((pot_acc.bounty_timer + (5 MINUTES))-world.time)/ (1 MINUTES), 0.01) + to_chat(usr, "You already have an incomplete civilian bounty, try again in [curr_time] minutes to replace it!") + return FALSE + var/datum/bounty/crumbs = random_bounty(pot_acc.account_job.bounty_types) //It's a good scene from War Dogs (2016). + /*if(SSeconomy.inflation_value() > 1) //lets try not to add inflation for right now + if(istype(crumbs, /datum/bounty/item)) + var/datum/bounty/item/items = crumbs + items.required_count = max(round((items.required_count)/(SSeconomy.inflation_value()*2)), 1) + if(istype(crumbs, /datum/bounty/reagent)) + var/datum/bounty/reagent/chems = crumbs + chems.required_volume = max(round((chems.required_volume)/SSeconomy.inflation_value()*2), 1) + crumbs.reward = round(crumbs.reward/(SSeconomy.inflation_value()*2))*/ + pot_acc.bounty_timer = world.time + pot_acc.civilian_bounty = crumbs + if("eject") + id_eject(usr, inserted_scan_id) + . = TRUE + +///Self explanitory, holds the ID card inthe console for bounty payout and manipulation. +/obj/machinery/computer/piratepad_control/civilian/proc/id_insert(mob/user, obj/item/inserting_item, obj/item/target) + var/obj/item/card/id/card_to_insert = inserting_item + var/holder_item = FALSE + + if(!isidcard(card_to_insert)) + card_to_insert = inserting_item.RemoveID() + holder_item = TRUE + + if(!card_to_insert || !user.transferItemToLoc(card_to_insert, src)) + return FALSE + + if(target) + if(holder_item && inserting_item.InsertID(target)) + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + else + id_eject(user, target) + + user.visible_message("[user] inserts \the [card_to_insert] into \the [src].", + "You insert \the [card_to_insert] into \the [src].") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + updateUsrDialog() + return TRUE + +///Removes A stored ID card. +/obj/machinery/computer/piratepad_control/civilian/proc/id_eject(mob/user, obj/target) + if(!target) + to_chat(user, "That slot is empty!") + return FALSE + else + target.forceMove(drop_location()) + if(!issilicon(user) && Adjacent(user)) + user.put_in_hands(target) + user.visible_message("[user] gets \the [target] from \the [src].", \ + "You get \the [target] from \the [src].") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + inserted_scan_id = null + updateUsrDialog() + return TRUE + + +///Beacon to launch a new bounty setup when activated. +/obj/item/civ_bounty_beacon + name = "civilian bounty beacon" + desc = "N.T. approved civilian bounty beacon, toss it down and you will have a bounty pad and computer delivered to you." + icon = 'icons/obj/objects.dmi' + icon_state = "floor_beacon" + var/uses = 2 + +/obj/item/civ_bounty_beacon/attack_self() + loc.visible_message("\The [src] begins to beep loudly!") + addtimer(CALLBACK(src, .proc/launch_payload), 4 SECONDS) + +/obj/item/civ_bounty_beacon/proc/launch_payload() + playsound(src, "sparks", 80, TRUE) + switch(uses) + if(2) + new /obj/machinery/piratepad/civilian(drop_location()) + if(1) + new /obj/machinery/computer/piratepad_control/civilian(drop_location()) + qdel(src) + uses = uses - 1 diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 464b3c5ccc..fac44ddf54 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -372,6 +372,11 @@ . += "The [D.account_holder] reports a balance of [D.account_balance] cr." . += "Alt-Click the ID to pull money from the linked account in the form of holochips." . += "You can insert credits into the linked account by pressing holochips, cash, or coins against the ID." + if(registered_account.civilian_bounty) + . += "There is an active civilian bounty." + . += "[registered_account.bounty_text()]" + . += "Quantity: [registered_account.bounty_num()]" + . += "Reward: [registered_account.bounty_value()]" if(registered_account.account_holder == user.real_name) . += "If you lose this ID card, you can reclaim your account by Alt-Clicking a blank ID card while holding it and entering your account ID number." else diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 74d11e9c11..7d23d25953 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -348,6 +348,10 @@ name = "Snow Taxi (Computer Board)" build_path = /obj/machinery/computer/shuttle/snow_taxi +/obj/item/circuitboard/computer/bountypad + name = "Bounty Pad (Computer Board)" + build_path = /obj/machinery/computer/piratepad_control/civilian + // /obj/item/circuitboard/computer/bountypad // name = "Bounty Pad (Computer Board)" // build_path = /obj/machinery/computer/piratepad_control/civilian diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index ef9825ee79..e16de56465 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -685,15 +685,15 @@ /obj/item/stack/sheet/glass = 1, /obj/item/vending_refill/donksoft = 1) -// /obj/item/circuitboard/machine/bountypad -// name = "Civilian Bounty Pad (Machine Board)" -// icon_state = "generic" -// build_path = /obj/machinery/piratepad/civilian -// req_components = list( -// /obj/item/stock_parts/card_reader = 1, -// /obj/item/stock_parts/scanning_module = 1, -// /obj/item/stock_parts/micro_laser = 1 -// ) + +/obj/item/circuitboard/machine/bountypad + name = "Civilian Bounty Pad (Machine Board)" + icon_state = "generic" + build_path = /obj/machinery/piratepad/civilian + req_components = list( + /obj/item/stock_parts/scanning_module = 1, + /obj/item/stock_parts/micro_laser = 1 + ) // /obj/item/circuitboard/machine/accounting // name = "Account Registration Device (Machine Board)" diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm index 744c01a257..35c7c787b6 100644 --- a/code/modules/cargo/bounties/assistant.dm +++ b/code/modules/cargo/bounties/assistant.dm @@ -101,27 +101,30 @@ required_count = 15 wanted_types = list(/obj/item/shard) +/* /datum/bounty/item/assistant/comfy_chair - name = "Comfy Chairs" + name = "Comfortable Chairs" description = "Commander Pat is unhappy with his chair. He claims it hurts his back. Ship some alternatives out to humor him." reward = 900 required_count = 5 wanted_types = list(/obj/structure/chair/comfy) +*/ -// /datum/bounty/item/assistant/geranium -// name = "Geraniums" -// description = "Commander Zot has the hots for Commander Zena. Send a shipment of geraniums - her favorite flower - and he'll happily reward you." -// reward = 1000 -// required_count = 3 -// wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium) + /datum/bounty/item/assistant/geranium + name = "Geraniums" + description = "Commander Zot has the hots for Commander Zena. Send a shipment of geraniums - her favorite flower - and he'll happily reward you." + reward = 1000 + required_count = 3 + wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium) + include_subtypes = FALSE -// /datum/bounty/item/assistant/poppy -// name = "Poppies" -// description = "Commander Zot really wants to sweep Security Officer Olivia off her feet. Send a shipment of Poppies - her favorite flower - and he'll happily reward you." -// reward = 1000 -// required_count = 3 -// wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy) -// include_subtypes = FALSE +/datum/bounty/item/assistant/poppy + name = "Poppies" + description = "Commander Zot really wants to sweep Security Officer Olivia off her feet. Send a shipment of Poppies - her favorite flower - and he'll happily reward you." + reward = 1000 + required_count = 3 + wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy) + include_subtypes = FALSE /datum/bounty/item/assistant/shadyjims name = "Shady Jim's" @@ -156,11 +159,6 @@ required_count = 3 wanted_types = list(/obj/item/reagent_containers/food/snacks/monkeycube) */ -/datum/bounty/item/assistant/chainsaw - name = "Chainsaw" - description = "The chef at CentCom is having trouble butchering her animals. She requests one chainsaw, please." - reward = 2500 - wanted_types = list(/obj/item/chainsaw) /datum/bounty/item/assistant/ied name = "IED" @@ -169,30 +167,12 @@ required_count = 3 wanted_types = list(/obj/item/grenade/iedcasing) -/datum/bounty/item/assistant/bonfire - name = "Lit Bonfire" - description = "Space heaters are malfunctioning and the cargo crew of Central Command is starting to feel cold. Ship a lit bonfire to warm them up." - reward = 5000 - wanted_types = list(/obj/structure/bonfire) - -/datum/bounty/item/assistant/bonfire/applies_to(obj/O) - if(!..()) - return FALSE - var/obj/structure/bonfire/B = O - return !!B.burning - /datum/bounty/item/assistant/corgimeat name = "Raw Corgi Meat" description = "The Syndicate recently stole all of CentCom's corgi meat. Ship out a replacement immediately." reward = 3000 wanted_types = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi) -/datum/bounty/item/assistant/tail_whip - name = "Nine Tails whip" - description = "Commander Jackson is looking for a fine addition to her exotic weapons collection. She will reward you handsomely for either a Cat or Liz o' Nine Tails." - reward = 4000 - wanted_types = list(/obj/item/melee/chainofcommand/tailwhip) - /datum/bounty/item/assistant/bolas name = "Bolas" description = "Centcom's chef has lost their mind. They're streaking naked though the halls, greased up with butter and cooking oil. Send some bola's so we can capture them." @@ -215,7 +195,7 @@ wanted_types = list(/obj/item/storage/belt/utility) /datum/bounty/item/assistant/gasmasks - name = "Gas Masks" + name = "Gas Masks" description = "The good news is that we have more miasma than we'll ever need. The bad news is, somone opened the release valve on the canisters. Ship us some gas masks!" reward = 1250 required_count = 4 diff --git a/code/modules/cargo/bounties/botany.dm b/code/modules/cargo/bounties/botany.dm index 31e13e9a9b..5ed2faec98 100644 --- a/code/modules/cargo/bounties/botany.dm +++ b/code/modules/cargo/bounties/botany.dm @@ -228,3 +228,14 @@ multiplier = 6 bonus_desc = "Under no circumstances mention this shipment to security." foodtype = "\"meal\"" + +/datum/bounty/item/botany/bonfire + name = "Lit Bonfire" + description = "Space heaters are malfunctioning and the cargo crew of Central Command is starting to feel cold. Grow some logs and Ship a lit bonfire to warm them up." + wanted_types = list(/obj/structure/bonfire) + +/datum/bounty/item/botany/bonfire/applies_to(obj/O) + if(!..()) + return FALSE + var/obj/structure/bonfire/B = O + return !!B.burning diff --git a/code/modules/cargo/bounties/chef.dm b/code/modules/cargo/bounties/chef.dm index c83fa116d6..9998fb0e8d 100644 --- a/code/modules/cargo/bounties/chef.dm +++ b/code/modules/cargo/bounties/chef.dm @@ -137,3 +137,10 @@ reward = 2250 required_count = 3 wanted_types = list(/obj/item/reagent_containers/food/snacks/bbqribs) + +/datum/bounty/item/chef/corgifarming //Butchering is a chef's job. + name = "Corgi Hides" + description = "Admiral Weinstein's space yacht needs new upholstery. A dozen Corgi furs should do just fine." + reward = 30000 //that's a lot of dead dogs + required_count = 12 + wanted_types = list(/obj/item/stack/sheet/animalhide/corgi) diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm index 5ddce8fb2c..59f5f083c8 100644 --- a/code/modules/cargo/bounties/engineering.dm +++ b/code/modules/cargo/bounties/engineering.dm @@ -89,3 +89,15 @@ description = "Station 24 is being overrun by hordes of angry Mothpeople. They are requesting the ultimate bug zapper." reward = 50000 //requires 14k credits of purchases, not to mention cooperation with engineering/heads of staff to set up inside the cramped shuttle wanted_types = list(/obj/singularity/energy_ball) + +/datum/bounty/item/engineering/emitter + name = "Emitter" + description = "We think there may be a defect in your station's emitter designs, based on the sheer number of delaminations your sector seems to see. Ship us one of yours." + reward = 2500 + wanted_types = list(/obj/machinery/power/emitter) + +/datum/bounty/item/engineering/hydro_tray + name = "Hydroponics Tray" + description = "The lab technicians are trying to figure out how to lower the power drain of hydroponics trays, but we fried our last one. Mind building one for us?" + reward = 2000 + wanted_types = list(/obj/machinery/hydroponics/constructable) diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm index c1f8d9c9d0..1f56b929e6 100644 --- a/code/modules/cargo/bounties/medical.dm +++ b/code/modules/cargo/bounties/medical.dm @@ -125,3 +125,15 @@ reward = 2250 required_count = 5 wanted_types = list(/obj/item/defibrillator) + +/datum/bounty/item/medical/chainsaw + name = "Chainsaw" + description = "A CMO at CentCom is having trouble operating on golems. She requests one chainsaw, please." + reward = 2500 + wanted_types = list(/obj/item/chainsaw) + +/datum/bounty/item/medical/tail_whip //Like the cat tail bounties, with more processing. + name = "Nine Tails whip" + description = "Commander Jackson is looking for a fine addition to her exotic weapons collection. She will reward you handsomely for either a Cat or Liz o' Nine Tails." + reward = 4000 + wanted_types = list(/obj/item/melee/chainofcommand/tailwhip) diff --git a/code/modules/cargo/bounties/security.dm b/code/modules/cargo/bounties/security.dm index 5ddf456573..d463e1393d 100644 --- a/code/modules/cargo/bounties/security.dm +++ b/code/modules/cargo/bounties/security.dm @@ -52,3 +52,37 @@ reward = 2750 required_count = 3 wanted_types = list(/obj/item/firing_pin/test_range) + +/datum/bounty/item/security/pepperspray + name = "Pepperspray" + description = "We've been having a bad run of riots on Space Station 76. We could use some new pepperspray cans." + reward = 3000 + required_count = 4 + wanted_types = list(/obj/item/reagent_containers/spray/pepper) + +/datum/bounty/item/security/prison_clothes + name = "Prison Uniforms" + description = "Terragov has been unable to source any new prisoner uniforms, so if you have any spares, we'll take them off your hands." + reward = 2000 + required_count = 4 + wanted_types = list(/obj/item/clothing/under/rank/prisoner) + +/datum/bounty/item/security/plates + name = "License Plates" + description = "As a result of a bad clown car crash, we could use an advance on some of your prisoner's license plates." + reward = 1000 + required_count = 10 + wanted_types = list(/obj/item/stack/license_plates/filled) + +/datum/bounty/item/security/earmuffs + name = "Earmuffs" + description = "Central Command is getting tired of your station's messages. They've ordered that you ship some earmuffs to lessen the annoyance." + reward = 1000 + wanted_types = list(/obj/item/clothing/ears/earmuffs) + +/datum/bounty/item/security/handcuffs + name = "Handcuffs" + description = "A large influx of escaped convicts have arrived at Central Command. Now is the perfect time to ship out spare handcuffs (or restraints)." + reward = 1000 + required_count = 5 + wanted_types = list(/obj/item/restraints/handcuffs) diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm index 2a64f150a0..4b24488a08 100644 --- a/code/modules/cargo/bounty.dm +++ b/code/modules/cargo/bounty.dm @@ -76,8 +76,13 @@ GLOBAL_LIST_EMPTY(bounties_list) return TRUE // Returns a new bounty of random type, but does not add it to GLOB.bounties_list. -/proc/random_bounty() - switch(rand(1, 15)) +/proc/random_bounty(var/guided = 0) + var/bounty_num + if(guided) + bounty_num = guided + else + bounty_num = rand(1,13) + switch(bounty_num) if(1) var/subtype = pick(subtypesof(/datum/bounty/item/assistant)) return new subtype @@ -100,27 +105,27 @@ GLOBAL_LIST_EMPTY(bounties_list) var/subtype = pick(subtypesof(/datum/bounty/virus)) return new subtype if(8) - var/subtype = pick(subtypesof(/datum/bounty/item/science)) - return new subtype - if(9) + if(rand(2) == 1) + var/subtype = pick(subtypesof(/datum/bounty/item/science)) + return new subtype var/subtype = pick(subtypesof(/datum/bounty/item/slime)) return new subtype - if(10) + if(9) var/subtype = pick(subtypesof(/datum/bounty/item/engineering)) return new subtype - if(11) + if(10) var/subtype = pick(subtypesof(/datum/bounty/item/mining)) return new subtype - if(12) + if(11) var/subtype = pick(subtypesof(/datum/bounty/item/medical)) return new subtype - if(13) + if(12) var/subtype = pick(subtypesof(/datum/bounty/item/botany)) return new subtype - if(14) + if(13) var/subtype = pick(subtypesof(/datum/bounty/item/silly)) return new subtype - if(15) + if(14) var/subtype = pick(subtypesof(/datum/bounty/item/gardencook)) return new subtype diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index e8b6498c36..7ebf9468ac 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -10,6 +10,8 @@ var/account_id var/being_dumped = FALSE //pink levels are rising var/withdrawDelay = 0 + var/datum/bounty/civilian_bounty + var/bounty_timer = 0 /datum/bank_account/New(newname, job) if(add_to_accounts) @@ -100,6 +102,47 @@ if(M.can_hear()) to_chat(M, "[icon2html(icon_source, M)] [message]") +/** + * Returns a string with the civilian bounty's description on it. + */ +/datum/bank_account/proc/bounty_text() + if(!civilian_bounty) + return FALSE + if(istype(civilian_bounty, /datum/bounty/item)) + var/datum/bounty/item/item = civilian_bounty + return item.description + if(istype(civilian_bounty, /datum/bounty/reagent)) + var/datum/bounty/reagent/chemical = civilian_bounty + return chemical.description + +/** + * Returns the required item count, or required chemical units required to submit a bounty. + */ +/datum/bank_account/proc/bounty_num() + if(!civilian_bounty) + return FALSE + if(istype(civilian_bounty, /datum/bounty/item)) + var/datum/bounty/item/item = civilian_bounty + return "[item.shipped_count]/[item.required_count]" + if(istype(civilian_bounty, /datum/bounty/reagent)) + var/datum/bounty/reagent/chemical = civilian_bounty + return "[chemical.shipped_volume]/[chemical.required_volume] u" + +/** + * Produces the value of the account's civilian bounty reward, if able. + */ +/datum/bank_account/proc/bounty_value() + if(!civilian_bounty) + return FALSE + return civilian_bounty.reward + +/** + * Performs house-cleaning on variables when a civilian bounty is replaced, or, when a bounty is claimed. + */ +/datum/bank_account/proc/reset_bounty() + civilian_bounty = null + bounty_timer = 0 + /datum/bank_account/department account_holder = "Guild Credit Agency" var/department_id = "REPLACE_ME" diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index ff9f86e932..e297df8238 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -71,6 +71,8 @@ var/display_order = JOB_DISPLAY_ORDER_DEFAULT + var/bounty_types = CIV_JOB_BASIC + //If a job complies with dresscodes, loadout items will not be equipped instead of the job's outfit, instead placing the items into the player's backpack. var/dresscodecompliant = TRUE // How much threat this job is worth in dynamic. Is subtracted if the player's not an antag, added if they are. diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index 2e89035bfa..9aa8ea07c4 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -20,6 +20,7 @@ ACCESS_ENGINE_EQUIP, ACCESS_EMERGENCY_STORAGE, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_ENG + bounty_types = CIV_JOB_ENG starting_modifiers = list(/datum/skill_modifier/job/level/wiring, /datum/skill_modifier/job/affinity/wiring) diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index c9f608fc00..70ca762f39 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -17,6 +17,7 @@ minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_SRV + bounty_types = CIV_JOB_DRINK display_order = JOB_DISPLAY_ORDER_BARTENDER threat = 0.5 diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm index 4c91f87791..53502ee30e 100644 --- a/code/modules/jobs/job_types/botanist.dm +++ b/code/modules/jobs/job_types/botanist.dm @@ -16,6 +16,7 @@ minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_SRV + bounty_types = CIV_JOB_GROW display_order = JOB_DISPLAY_ORDER_BOTANIST threat = 1.5 // lol powergame diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index 6d4204d041..209b3f82d0 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -18,6 +18,7 @@ minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_MED + bounty_types = CIV_JOB_CHEM display_order = JOB_DISPLAY_ORDER_CHEMIST threat = 1.5 diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index e77338365d..60b963d7ec 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -30,6 +30,7 @@ ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_COMMAND paycheck_department = ACCOUNT_ENG + bounty_types = CIV_JOB_ENG starting_modifiers = list(/datum/skill_modifier/job/level/wiring/expert, /datum/skill_modifier/job/affinity/wiring) diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 89b06f6802..401b503110 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -28,6 +28,7 @@ ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS) paycheck = PAYCHECK_COMMAND paycheck_department = ACCOUNT_MED + bounty_types = CIV_JOB_MED display_order = JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index 666ee8f036..2a021e6575 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -17,6 +17,7 @@ minimal_access = list(ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_SRV + bounty_types = CIV_JOB_CHEF display_order = JOB_DISPLAY_ORDER_COOK threat = 0.2 diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index 5ff1bebfbf..611c3f99cd 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -18,6 +18,7 @@ minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_MED + bounty_types = CIV_JOB_SCI display_order = JOB_DISPLAY_ORDER_GENETICIST threat = 1.5 diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index 57f248b760..5339b5927c 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -32,6 +32,8 @@ ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_COMMAND paycheck_department = ACCOUNT_SEC + bounty_types = CIV_JOB_SEC + display_order = JOB_DISPLAY_ORDER_HEAD_OF_SECURITY blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/blindness, /datum/quirk/monophobia, /datum/quirk/insanity) diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index d6a763acfe..75a85c88d1 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -16,6 +16,7 @@ minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_MED + bounty_types = CIV_JOB_MED display_order = JOB_DISPLAY_ORDER_MEDICAL_DOCTOR threat = 0.5 diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index b9fc5809e3..2b374921be 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -16,6 +16,7 @@ minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_MED + bounty_types = CIV_JOB_MED display_order = JOB_DISPLAY_ORDER_PARAMEDIC diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 50ce44a8b4..178bcc3188 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -32,6 +32,7 @@ ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK) paycheck = PAYCHECK_COMMAND paycheck_department = ACCOUNT_SCI + bounty_types = CIV_JOB_SCI display_order = JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR starting_modifiers = list(/datum/skill_modifier/job/level/wiring) diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index 90dacc0482..6f7b91571b 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -18,6 +18,7 @@ minimal_access = list(ACCESS_ROBOTICS, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_SCI + bounty_types = CIV_JOB_ROBO starting_modifiers = list(/datum/skill_modifier/job/level/wiring, /datum/skill_modifier/job/affinity/wiring) diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index eda88a5911..10e3f58594 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -18,6 +18,7 @@ minimal_access = list(ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_SCI + bounty_types = CIV_JOB_SCI starting_modifiers = list(/datum/skill_modifier/job/level/wiring/basic) display_order = JOB_DISPLAY_ORDER_SCIENTIST threat = 1.2 diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 77cf04cbf7..1b06d050b7 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -21,6 +21,7 @@ minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/officer/get_access() paycheck = PAYCHECK_HARD paycheck_department = ACCOUNT_SEC + bounty_types = CIV_JOB_SEC mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 273f74defa..e693335779 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -19,6 +19,7 @@ minimal_access = list(ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_EASY ///Not necessarily easy itself, but it can be trivial to make lot of cash on this job. paycheck_department = ACCOUNT_CAR + bounty_types = CIV_JOB_MINE display_order = JOB_DISPLAY_ORDER_SHAFT_MINER diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index 83b11b22f6..e2248362d0 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -20,6 +20,7 @@ ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_ENG + bounty_types = CIV_JOB_ENG starting_modifiers = list(/datum/skill_modifier/job/level/wiring, /datum/skill_modifier/job/affinity/wiring) diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index 3e9b3ba06c..be844be529 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -18,6 +18,7 @@ minimal_access = list(ACCESS_MEDICAL, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_MED + bounty_types = CIV_JOB_VIRO display_order = JOB_DISPLAY_ORDER_VIROLOGIST diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index 26decc294f..8e3ef5a253 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -22,6 +22,7 @@ paycheck = PAYCHECK_HARD paycheck_department = ACCOUNT_SEC + bounty_types = CIV_JOB_SEC mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm deleted file mode 100644 index 8f3431ba1b..0000000000 --- a/code/modules/mining/mint.dm +++ /dev/null @@ -1,146 +0,0 @@ -/**********************Mint**************************/ - - -/obj/machinery/mineral/mint - name = "coin press" - icon = 'icons/obj/economy.dmi' - icon_state = "coinpress0" - density = TRUE - input_dir = EAST - ui_x = 300 - ui_y = 250 - needs_item_input = TRUE - var/obj/item/storage/bag/money/bag_to_use - var/produced_coins = 0 // how many coins the machine has made in it's last cycle - var/processing = FALSE - var/chosen = /datum/material/iron //which material will be used to make coins - - -/obj/machinery/mineral/mint/Initialize(mapload) - . = ..() - AddComponent(/datum/component/material_container, list( - /datum/material/iron, - /datum/material/plasma, - /datum/material/silver, - /datum/material/gold, - /datum/material/uranium, - /datum/material/titanium, - /datum/material/diamond, - /datum/material/bananium, - /datum/material/adamantine, - /datum/material/mythril, - /datum/material/plastic, - /datum/material/runite - ), MINERAL_MATERIAL_AMOUNT * 75, FALSE, /obj/item/stack) - chosen = SSmaterials.GetMaterialRef(chosen) - - -/obj/machinery/mineral/mint/pickup_item(datum/source, atom/movable/target, atom/oldLoc) - if(QDELETED(target)) - return - if(!istype(target, /obj/item/stack)) - return - - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - var/obj/item/stack/S = target - - if(materials.insert_item(S)) - qdel(S) - -/obj/machinery/mineral/mint/process() - if(processing) - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - var/datum/material/M = chosen - - if(!M) - processing = FALSE - icon_state = "coinpress0" - return - - icon_state = "coinpress1" - var/coin_mat = MINERAL_MATERIAL_AMOUNT - - for(var/sheets in 1 to 2) - if(materials.use_amount_mat(coin_mat, chosen)) - for(var/coin_to_make in 1 to 5) - create_coins() - else - var/found_new = FALSE - for(var/datum/material/inserted_material in materials.materials) - var/amount = materials.get_material_amount(inserted_material) - - if(amount) - chosen = inserted_material - found_new = TRUE - - if(!found_new) - processing = FALSE - else - STOP_PROCESSING(SSmachines, src) - icon_state = "coinpress0" - -/obj/machinery/mineral/mint/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "Mint", name) - ui.open() - -/obj/machinery/mineral/mint/ui_data() - var/list/data = list() - data["inserted_materials"] = list() - data["chosen_material"] = null - - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - for(var/datum/material/inserted_material in materials.materials) - var/amount = materials.get_material_amount(inserted_material) - if(!amount) - continue - data["inserted_materials"] += list(list( - "material" = inserted_material.name, - "amount" = amount, - )) - if(chosen == inserted_material) - data["chosen_material"] = inserted_material.name - - data["produced_coins"] = produced_coins - data["processing"] = processing - - return data; - -/obj/machinery/mineral/mint/ui_act(action, params, datum/tgui/ui) - . = ..() - if(.) - return - if(action == "startpress") - if (!processing) - produced_coins = 0 - processing = TRUE - START_PROCESSING(SSmachines, src) - return TRUE - if (action == "stoppress") - processing = FALSE - STOP_PROCESSING(SSmachines, src) - return TRUE - if (action == "changematerial") - var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) - for(var/datum/material/mat in materials.materials) - if (params["material_name"] == mat.name) - chosen = mat - return TRUE - -/obj/machinery/mineral/mint/proc/create_coins() - set waitfor = FALSE - var/turf/T = get_step(src,output_dir) - var/temp_list = list() - temp_list[chosen] = 400 - if(T) - var/obj/item/O = new /obj/item/coin(src) - O.set_custom_materials(temp_list) - if(QDELETED(bag_to_use) || (bag_to_use.loc != T) || !SEND_SIGNAL(bag_to_use, COMSIG_TRY_STORAGE_INSERT, O, null, TRUE)) //important to send the signal so we don't overfill the bag. - bag_to_use = new(src) //make a new bag if we can't find or use the old one. - unload_mineral(bag_to_use) //just forcemove memes. - O.forceMove(bag_to_use) //don't bother sending the signal, the new bag is empty and all that. - - SSblackbox.record_feedback("amount", "coins_minted", 1) - produced_coins++ - CHECK_TICK diff --git a/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo.dm b/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo.dm index e5f7fdc004..f2514b6f9c 100644 --- a/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo.dm +++ b/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo.dm @@ -41,3 +41,10 @@ build_path = /obj/item/circuitboard/computer/mining_shuttle category = list("Computer Boards") departmental_flags = DEPARTMENTAL_FLAG_CARGO + +/datum/design/board/bountypad_control + name = "Computer Design (Civilian Bounty Pad Control)" + desc = "Allows for the construction of circuit boards used to build a new civilian bounty pad console." + id = "bounty_pad_control" + build_path = /obj/item/circuitboard/computer/bountypad + category = list("Computer Boards") diff --git a/code/modules/research/designs/machine_desings/machine_designs_cargo.dm b/code/modules/research/designs/machine_desings/machine_designs_cargo.dm index 1ed868cde9..3abb757f36 100644 --- a/code/modules/research/designs/machine_desings/machine_designs_cargo.dm +++ b/code/modules/research/designs/machine_desings/machine_designs_cargo.dm @@ -40,3 +40,10 @@ build_path = /obj/item/circuitboard/machine/ore_redemption category = list ("Misc. Machinery") departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/board/bountypad + name = "Machine Design (Civilian Bounty Pad)" + desc = "The circuit board for a Civilian Bounty Pad." + id = "bounty_pad" + build_path = /obj/item/circuitboard/machine/bountypad + category = list ("Misc. Machinery") diff --git a/code/modules/research/techweb/nodes/misc_nodes.dm b/code/modules/research/techweb/nodes/misc_nodes.dm index 2e5fdca6bf..f26a34148f 100644 --- a/code/modules/research/techweb/nodes/misc_nodes.dm +++ b/code/modules/research/techweb/nodes/misc_nodes.dm @@ -12,7 +12,7 @@ display_name = "Advanced Data Theory" description = "Better insight into programming and data." prereq_ids = list("datatheory") - design_ids = list("icprinter", "icupgadv", "icupgclo") + design_ids = list("icprinter", "icupgadv", "icupgclo","bounty_pad","bounty_pad_control") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000) /////////////////////////plasma tech///////////////////////// diff --git a/sound/machines/wewewew.ogg b/sound/machines/wewewew.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b521e0c9761b43c4e7eb4ff655483334f08c2841 GIT binary patch literal 21442 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 { - const { act, data } = useBackend(context); - const inserted_materials = data.inserted_materials || []; - return ( - - -
act(data.processing - ? 'stoppress' - : 'startpress')} /> - }> - - {inserted_materials.map(material => ( - act('changematerial', { - material_name: material.material, - })} /> - )}> - {material.amount} cm³ - - ))} - -
-
- Pressed {data.produced_coins} coins this cycle. -
-
-
- ); -}; From b4f886d99935e23268b6f78cdb9a029da92565d2 Mon Sep 17 00:00:00 2001 From: shellspeed1 Date: Sun, 18 Sep 2022 20:55:22 -0700 Subject: [PATCH 02/14] port of https://github.com/tgstation/tgstation/pull/49111 aka sales taggers, credit to ArcaneMusic --- code/__DEFINES/dcs/signals.dm | 8 + code/datums/components/pricetag.dm | 28 +++ .../objects/effects/decals/cleanable/misc.dm | 6 + code/game/objects/items/stacks/wrap.dm | 8 + code/game/objects/items/storage/boxes.dm | 15 ++ code/modules/cargo/bounties/assistant.dm | 6 +- code/modules/cargo/exports.dm | 14 +- code/modules/recycling/sortingmachinery.dm | 207 ++++++++++++++++++ .../autolathe_designs_electronics.dm | 9 + .../modules/research/techweb/_techweb_node.dm | 2 +- icons/obj/computer.dmi | Bin 133325 -> 133844 bytes icons/obj/device.dmi | Bin 60553 -> 60944 bytes icons/obj/storage.dmi | Bin 73466 -> 73695 bytes tgstation.dme | 1 + 14 files changed, 299 insertions(+), 5 deletions(-) create mode 100644 code/datums/components/pricetag.dm diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 9de0dbe7c5..fa86b909ea 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -474,6 +474,14 @@ #define COMPONENT_BLOCK_SHARPEN_ALREADY 4 #define COMPONENT_BLOCK_SHARPEN_MAXED 8 #define COMSIG_ITEM_MICROWAVE_ACT "microwave_act" //called on item when microwaved (): (obj/machinery/microwave/M) + +// /obj/item signals for economy +#define COMSIG_ITEM_SOLD "item_sold" //called when an item is sold by the exports subsystem +#define COMSIG_STRUCTURE_UNWRAPPED "structure_unwrapped" //called when a wrapped up structure is opened by hand +#define COMSIG_ITEM_UNWRAPPED "item_unwrapped" //called when a wrapped up item is opened by hand + #define COMSIG_ITEM_SPLIT_VALUE 1 +#define COMSIG_ITEM_SPLIT_PROFIT "item_split_profits" //Called when getting the item's exact ratio for cargo's profit. + #define COMSIG_ITEM_WORN_OVERLAYS "item_worn_overlays" //from base of obj/item/worn_overlays(): (isinhands, icon_file, used_state, style_flags, list/overlays) #define COMSIG_ARMOR_PLATED "armor_plated" //called when an armor plate is successfully applied to an object // THE FOLLOWING TWO BLOCKS SHOULD RETURN BLOCK FLAGS AS DEFINED IN __DEFINES/combat.dm! diff --git a/code/datums/components/pricetag.dm b/code/datums/components/pricetag.dm new file mode 100644 index 0000000000..3220dc425a --- /dev/null +++ b/code/datums/components/pricetag.dm @@ -0,0 +1,28 @@ +/datum/component/pricetag + var/datum/bank_account/owner + var/profit_ratio = 1 + +/datum/component/pricetag/Initialize(_owner,_profit_ratio) + if(!isobj(parent)) //Has to account for both objects and sellable structures like crates. + return COMPONENT_INCOMPATIBLE + owner = _owner + if(_profit_ratio) + profit_ratio = _profit_ratio + RegisterSignal(parent, COMSIG_ITEM_SOLD, .proc/split_profit) + RegisterSignal(parent, COMSIG_STRUCTURE_UNWRAPPED, .proc/Unwrapped) + RegisterSignal(parent, COMSIG_ITEM_UNWRAPPED, .proc/Unwrapped) + RegisterSignal(parent, COMSIG_ITEM_SPLIT_PROFIT, .proc/return_ratio) + +/datum/component/pricetag/proc/Unwrapped() + qdel(src) //Once it leaves it's wrapped container, the object in question should lose it's pricetag component. + +/datum/component/pricetag/proc/split_profit(var/item_value) + var/price = item_value + if(price) + var/adjusted_value = price*(profit_ratio/100) + owner.adjust_money(adjusted_value) + owner.bank_card_talk("Sale recorded. [adjusted_value] credits added to account.") + return TRUE + +/datum/component/pricetag/proc/return_ratio() + return profit_ratio diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index cc9fc8c2b3..7033284a86 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -311,3 +311,9 @@ random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") mergeable_decal = TRUE persistent = TRUE + +/obj/effect/decal/cleanable/wrapping + name = "wrapping shreds" + desc = "Torn pieces of cardboard and paper, left over from a package." + icon = 'icons/obj/objects.dmi' + icon_state = "paper_shreds" diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index 6ae63e640f..c969e2d1d4 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -20,6 +20,9 @@ if(QDELETED(src) && !transfer) new /obj/item/c_tube(T) +/obj/item/stack/wrapping_paper/small + desc = "Wrap packages with this festive paper to make gifts. This roll looks a bit skimpy." + amount = 10 /* * Package Wrap @@ -121,6 +124,11 @@ if(QDELETED(src) && !transfer) new /obj/item/c_tube(T) +/obj/item/stack/packageWrap/small + desc = "You can use this to wrap items in. This roll looks a bit skimpy." + w_class = WEIGHT_CLASS_SMALL + amount = 5 + /obj/item/c_tube name = "cardboard tube" desc = "A tube... of cardboard." diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 79280faca6..a2ab0c2ff4 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -1456,3 +1456,18 @@ /obj/item/storage/box/strange_seeds_5pack/PopulateContents() for(var/i in 1 to 5) new /obj/item/seeds/random(src) + +/obj/item/storage/box/shipping + name = "box of shipping supplies" + desc = "Contains several scanners and labelers for shipping things. Wrapping Paper not included." + illustration = "shipping" + +/obj/item/storage/box/shipping/PopulateContents() + var/static/items_inside = list( + /obj/item/destTagger=1,\ + /obj/item/sales_tagger=1,\ + /obj/item/export_scanner=1,\ + /obj/item/stack/packageWrap/small=2,\ + /obj/item/stack/wrapping_paper/small=1 + ) + generate_items_inside(items_inside,src) diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm index 35c7c787b6..a009ef20af 100644 --- a/code/modules/cargo/bounties/assistant.dm +++ b/code/modules/cargo/bounties/assistant.dm @@ -101,22 +101,22 @@ required_count = 15 wanted_types = list(/obj/item/shard) -/* /datum/bounty/item/assistant/comfy_chair name = "Comfortable Chairs" description = "Commander Pat is unhappy with his chair. He claims it hurts his back. Ship some alternatives out to humor him." reward = 900 required_count = 5 wanted_types = list(/obj/structure/chair/comfy) -*/ - /datum/bounty/item/assistant/geranium +/* +/datum/bounty/item/assistant/geranium name = "Geraniums" description = "Commander Zot has the hots for Commander Zena. Send a shipment of geraniums - her favorite flower - and he'll happily reward you." reward = 1000 required_count = 3 wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium) include_subtypes = FALSE +*/ /datum/bounty/item/assistant/poppy name = "Poppies" diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index e6ed245294..66713a3053 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -33,6 +33,8 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they if(!GLOB.exports_list.len) setupExports() + var/profit_ratio = 1 //Percentage that gets sent to the seller, rest goes to cargo. + var/list/contents = AM.GetAllContents() var/datum/export_report/report = external_report @@ -47,7 +49,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they if(!E) continue if(E.applies_to(thing, allowed_categories, apply_elastic)) - sold = E.sell_object(thing, report, dry_run, allowed_categories , apply_elastic) + sold = E.sell_object(thing, report, dry_run, allowed_categories , apply_elastic, profit_ratio) report.exported_atoms += " [thing.name]" break if(thing.reagents?.value_multiplier) @@ -138,9 +140,19 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they var/the_cost = get_cost(O, allowed_categories , apply_elastic) var/amount = get_amount(O) + var/profit_ratio = 0 + if(amount <=0 || the_cost <=0) return FALSE + if(dry_run == FALSE) + if(SEND_SIGNAL(O, COMSIG_ITEM_SOLD, item_value = get_cost(O, allowed_categories , apply_elastic)) & COMSIG_ITEM_SPLIT_VALUE) + profit_ratio = SEND_SIGNAL(O, COMSIG_ITEM_SPLIT_PROFIT) + the_cost = the_cost*((100-profit_ratio)/100) + else + profit_ratio = SEND_SIGNAL(O, COMSIG_ITEM_SPLIT_PROFIT) + the_cost = the_cost*((100-profit_ratio)/100) + report.total_value[src] += the_cost if(istype(O, /datum/export/material)) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 008e093b74..28176e5ed4 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -7,9 +7,15 @@ mouse_drag_pointer = MOUSE_ACTIVE_POINTER var/giftwrapped = FALSE var/sortTag = 0 + var/obj/item/barcode/sticker /obj/structure/bigDelivery/interact(mob/user) + to_chat(user, "You start to unwrap the package...") + if(!do_after(user, 15, target = user)) + return playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) + new /obj/effect/decal/cleanable/wrapping(get_turf(user)) + unwrap_contents() qdel(src) /obj/structure/bigDelivery/Destroy() @@ -18,6 +24,11 @@ AM.forceMove(T) return ..() +/obj/structure/bigDelivery/examine(mob/user) + . = ..() + if(sticker) + . += "There's a barcode attached to the side." + /obj/structure/bigDelivery/contents_explosion(severity, target, origin) for(var/atom/movable/AM in contents) AM.ex_act(severity, target, origin) @@ -53,6 +64,47 @@ icon_state = "gift[icon_state]" else to_chat(user, "You need more paper!") + else if(istype(W, /obj/item/sales_tagger)) + var/obj/item/sales_tagger/tagger = W + if(sticker) + to_chat(user, "This package already has a barcode attached!") + return + if(!(tagger.payments_acc)) + to_chat(user, "Swipe an ID on [tagger] first!") + return + if(tagger.paper_count <= 0) + to_chat(user, "[tagger] is out of paper!") + return + user.visible_message("[user] attaches a barcode to [src].", "You attach a barcode to [src].") + tagger.paper_count -= 1 + sticker = new /obj/item/barcode(src) + sticker.payments_acc = tagger.payments_acc //new tag gets the tagger's current account. + sticker.percent_cut = tagger.percent_cut //same, but for the percentage taken. + + var/list/wrap_contents = src.GetAllContents() + for(var/obj/I in wrap_contents) + I.AddComponent(/datum/component/pricetag, sticker.payments_acc, tagger.percent_cut) + var/overlaystring = "[icon_state]_tag" + if(giftwrapped) + overlaystring = copytext(overlaystring, 5) + add_overlay(overlaystring) + else if(istype(W, /obj/item/barcode)) + var/obj/item/barcode/stickerA = W + if(sticker) + to_chat(user, "This package already has a barcode attached!") + return + if(!(stickerA.payments_acc)) + to_chat(user, "This barcode seems to be invalid. Guess it's trash now.") + return + if(!user.transferItemToLoc(W, src)) + to_chat(user, "For some reason, you can't attach [W]!") + return + sticker = stickerA + var/overlaystring = "[icon_state]_tag" + if(giftwrapped) + overlaystring = copytext_char(overlaystring, 5) //5 == length("gift") + 1 + add_overlay(overlaystring) + else return ..() @@ -68,11 +120,18 @@ to_chat(user, "You successfully removed [O]'s wrapping !") O.forceMove(loc) playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) + new /obj/effect/decal/cleanable/wrapping(get_turf(user)) + unwrap_contents() qdel(src) else if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. to_chat(user, "You fail to remove [O]'s wrapping!") +/obj/structure/bigDelivery/proc/unwrap_contents() + if(!sticker) + return + for(var/obj/I in src.GetAllContents()) + SEND_SIGNAL(I, COMSIG_STRUCTURE_UNWRAPPED) /obj/item/smallDelivery name = "parcel" @@ -81,17 +140,23 @@ icon_state = "deliverypackage3" var/giftwrapped = 0 var/sortTag = 0 + var/obj/item/barcode/sticker /obj/item/smallDelivery/contents_explosion(severity, target, origin) for(var/atom/movable/AM in contents) AM.ex_act(severity, target, origin) /obj/item/smallDelivery/attack_self(mob/user) + to_chat(user, "You start to unwrap the package...") + if(!do_after(user, 15, target = user)) + return user.temporarilyRemoveItemFromInventory(src, TRUE) + unwrap_contents() for(var/X in contents) var/atom/movable/AM = X user.put_in_hands(AM) playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) + new /obj/effect/decal/cleanable/wrapping(get_turf(user)) qdel(src) /obj/item/smallDelivery/attack_self_tk(mob/user) @@ -106,6 +171,8 @@ var/atom/movable/AM = X AM.forceMove(src.loc) playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) + new /obj/effect/decal/cleanable/wrapping(get_turf(user)) + unwrap_contents() qdel(src) /obj/item/smallDelivery/attackby(obj/item/W, mob/user, params) @@ -140,6 +207,59 @@ else to_chat(user, "You need more paper!") + else if(istype(W, /obj/item/sales_tagger)) + var/obj/item/sales_tagger/tagger = W + if(sticker) + to_chat(user, "This package already has a barcode attached!") + return + if(!(tagger.payments_acc)) + to_chat(user, "Swipe an ID on [tagger] first!") + return + if(tagger.paper_count <= 0) + to_chat(user, "[tagger] is out of paper!") + return + user.visible_message("[user] attaches a barcode to [src].", "You attach a barcode to [src].") + tagger.paper_count -= 1 + sticker = new /obj/item/barcode(src) + sticker.payments_acc = tagger.payments_acc //new tag gets the tagger's current account. + sticker.percent_cut = tagger.percent_cut //as above, as before. + + var/list/wrap_contents = src.GetAllContents() + for(var/obj/I in wrap_contents) + I.AddComponent(/datum/component/pricetag, sticker.payments_acc, tagger.percent_cut) + var/overlaystring = "[icon_state]_tag" + if(giftwrapped) + overlaystring = copytext(overlaystring, 5) + add_overlay(overlaystring) + + else if(istype(W, /obj/item/barcode)) + var/obj/item/barcode/stickerA = W + if(sticker) + to_chat(user, "This package already has a barcode attached!") + return + if(!(stickerA.payments_acc)) + to_chat(user, "This barcode seems to be invalid. Guess it's trash now.") + return + if(!user.transferItemToLoc(W, src)) + to_chat(user, "For some reason, you can't attach [W]!") + return + sticker = stickerA + var/overlaystring = "[icon_state]_tag" + if(giftwrapped) + overlaystring = copytext_char(overlaystring, 5) //5 == length("gift") + 1 + add_overlay(overlaystring) + +/obj/item/smallDelivery/proc/unwrap_contents() + if(!sticker) + return + for(var/obj/I in src.GetAllContents()) + SEND_SIGNAL(I, COMSIG_ITEM_UNWRAPPED) + +/obj/item/smallDelivery/examine(mob/user) + . = ..() + if(sticker) + . += "There's a barcode attached to the side." + /obj/item/destTagger name = "destination tagger" @@ -194,3 +314,90 @@ var/n = text2num(href_list["nextTag"]) currTag = n openwindow(usr) + +/obj/item/sales_tagger + name = "sales tagger" + desc = "A scanner that lets you tag wrapped items for sale, splitting the profit between you and cargo. Ctrl-Click to clear the registered account." + icon = 'icons/obj/device.dmi' + icon_state = "salestagger" + item_state = "electronic" + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + w_class = WEIGHT_CLASS_TINY + slot_flags = ITEM_SLOT_BELT + ///The account which is recieving the split profits. + var/datum/bank_account/payments_acc = null + var/paper_count = 10 + var/max_paper_count = 20 + ///Details the percentage the scanned account recieves off the final sale. + var/percent_cut = 20 + +/obj/item/sales_tagger/examine(mob/user) + . = ..() + . += "[src] has [paper_count]/[max_paper_count] available barcodes. Refill with paper." + . += "Profit split on sale is currently set to [percent_cut]%." + +/obj/item/sales_tagger/attackby(obj/item/I, mob/living/user, params) + . = ..() + if(istype(I, /obj/item/card/id)) + var/obj/item/card/id/potential_acc = I + if(potential_acc.registered_account) + payments_acc = potential_acc.registered_account + playsound(src, 'sound/machines/ping.ogg', 40, TRUE) + to_chat(user, "[src] registers the ID card. Tag a wrapped item to create a barcode.") + else if(!potential_acc.registered_account) + to_chat(user, "This ID card has no account registered!") + return + else if(payments_acc != potential_acc.registered_account) + to_chat(user, "ID card already registered.") + if(istype(I, /obj/item/paper)) + if (!(paper_count >= max_paper_count)) + paper_count += 10 + qdel(I) + if (paper_count >= max_paper_count) + paper_count = max_paper_count + to_chat(user, "[src]'s paper supply is now full.") + return + to_chat(user, "You refill [src]'s paper supply, you have [paper_count] left.") + return + else + to_chat(user, "[src]'s paper supply is full.") + return + +/obj/item/sales_tagger/attack_self(mob/user) + . = ..() + if(paper_count <= 0) + to_chat(user, "You're out of paper!'.") + return + if(!payments_acc) + to_chat(user, "You need to swipe [src] with an ID card first.") + return + paper_count -= 1 + playsound(src, 'sound/machines/click.ogg', 40, TRUE) + to_chat(user, "You print a new barcode.") + var/obj/item/barcode/new_barcode = new /obj/item/barcode(src) + new_barcode.payments_acc = payments_acc //The sticker gets the scanner's registered account. + user.put_in_hands(new_barcode) + +/obj/item/sales_tagger/CtrlClick(mob/user) + . = ..() + payments_acc = null + to_chat(user, "You clear the registered account.") + +/obj/item/sales_tagger/AltClick(mob/user) + . = ..() + var/potential_cut = input("How much would you like to payout to the registered card?","Percentage Profit") as num|null + if(!potential_cut) + percent_cut = 50 + percent_cut = clamp(round(potential_cut, 1), 1, 50) + to_chat(user, "[percent_cut]% profit will be recieved if a package with a barcode is sold.") + +/obj/item/barcode + name = "Barcode tag" + desc = "A tiny tag, associated with a crewmember's account. Attach to a wrapped item to give that account a portion of the wrapped item's profit." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "barcode" + w_class = WEIGHT_CLASS_TINY + ///All values inheirited from the sales tagger it came from. + var/datum/bank_account/payments_acc = null + var/percent_cut = 5 diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm index 78b0a365c5..fea67a921f 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm @@ -90,3 +90,12 @@ materials = list(/datum/material/iron = 2010, /datum/material/glass = 5) build_path = /obj/item/electronics/electrochromatic_kit category = list("initial", "Electronics") + +/datum/design/salestagger + name = "Sales Tagger" + id = "salestagger" + build_type = AUTOLATHE | PROTOLATHE + materials = list(/datum/material/iron = 700, /datum/material/glass = 200) + build_path = /obj/item/sales_tagger + category = list("initial", "Electronics") + departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SERVICE diff --git a/code/modules/research/techweb/_techweb_node.dm b/code/modules/research/techweb/_techweb_node.dm index 8c91c09abb..92eaa2bd41 100644 --- a/code/modules/research/techweb/_techweb_node.dm +++ b/code/modules/research/techweb/_techweb_node.dm @@ -106,4 +106,4 @@ "destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "bepis", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab", "paystand", "space_heater", "beaker", "large_beaker", "xlarge_beaker", "bucket", "hypovial", "large_hypovial", "syringe", "pillbottle", "sec_shellclip", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_islug", "sec_dart", "sec_38", "sec_38lethal", - "rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass") + "rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass", "salestagger") diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi index 33cd46d15f603b4a68629ab9b1ab465a2b8dbf26..36402ad2d54c928911cb97a9567b1c61215860d7 100644 GIT binary patch delta 24918 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 RT1Ox-j0}-y$_(u9{Riw;FQotg delta 24141 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�m* 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 diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 5254b53d2b30cb5253492798f4c7c63267bd94dd..62fe5bbf921346a989a6e0de5fd7b37fd61878d5 100644 GIT binary patch delta 19169 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 Iiv`~LFHi4nBme*a delta 18759 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 delta 12347 zcma*N1yozn_a++LofdbB6k6Qfp?IN4u>!@lxP==WiWOSi9g4e4f#MW*mjH$09&EyI z=FPnKpY_&Eva)V+?ynUj+a$s2>Iod*e4t)0sr z7?44~a+%-iSsJ!1?1f8>y#UXgU-EIsAmrUL9J+HJwN>89G8ZP(WW| z5LB|h>;tjs3+G>Os{%d59EEnj|olb|} zm$P*XOH^|fREcpNOkEX7&T3+>6K%N-^vC|`W21>#VnT2FT1Rqr$O9Af9C-_B-r~eC z%?5$y8Xkue>R0uYQb6Y;>k096NxHyqG}iup65;*~BS=3*`iqaw11iD>s<=stL8L(9 zmk4Ujpw4hFiht5FZxYBD*@*|gSS1bhriCC%E2~QwIOmX}DVRytzp@2+7KB#Py~`+c z)FI&$A)muL7=3{5JnFGrGFl-{tOTq>cU)X=8yo{Lg~#e=wrTmRse5+_0{Jde*qb6q zy|g9YXGyt8cB5wM*47#%YGNU19)|!PTwlDAcvin34V*l@4`?kwY*a=WI=zhULVYRu zj>0_c9`GJ9Qy@&9!Ik?ooPqz^;5b-gA&@zENJo@TyWum1kwcKsaaX555o9%#?p3up zJF+upVl|7bexu=^6@8ZauPVPg#-Jk)fz0ZTzox`AjM}?KL86OtD7nR>=~a<2FC$cE9RiqKbNRx` z@)S;4f-lzF>iN*3gESuuRuNlMEg}FDE>1|YJ|1rgPpQG%Qu|Pxq`QQa(SdKaW{nN@ z&=l3O(;fuZ>=XwDLmN8G3ZSk}b0HRYqlV3njhqbEt76dfm#e%f=T(=5U~qufU5yET zdtmM$^&!#lR&gv)oY#DTnNG$TsB1d)Jpr-I+k^Aq0hK1lPxFo23zp*1xhdcV@H z)Pza)Ahe1I9nm`4y^_wxepj8(zk~UcSg3LPlc6U1r;mVKCGzQlu3<9*XUd1Js?JDh zN$EN1_OAp@pzdV`6a%{e$NFf;-ol$71`Q=6&^?5L`A_m5Z^e^}{xla<$_N!PItXp= z>UP*?5{@U{&_!{SNvad+f5GFMC{K{p6zZ*E zb!hq4sQ{u+J`wkx3kP_-!c!AM%M%pY!j1x!$@!5j06RMP)W{A%9RVhUqSS#J^U=@V zUlYyUULU>QXpzR;PtkQ;haxU=eRJ>7S^xwI-l#u-y(k(cNo`Bxlvv}x|6)Xd+A(0e zY2ED?_{=b&b$zktjA2vIZ-lmR;$nu@&Qphiv8iHxG{yy3v1cgUv5jcl`^nDw9*_kx z4*G_XmisV!ey;;NeUgTjD@+2PoQGr}8+~7K3ilmYiYQ3TH!*FaU^gT0ZBQ*6=b$VF zn-%W^FWBL`8&TI@{?INbuAgj1c-1TAlU4n>qq6nPWUL2iWJ-?Ua zo$-gtIZqZK%u40V)?3@)V82gat@#9aK^#2Hx{s?I);a%1`FUq8awrSBJLE7v8`;K1 zuDOhtO8_6%DkZ?)h7ymr-j_7n5mGYX z9#w2&q8Drt5rs^djH*5ksy?`jEj1O|x^}*c>6z)i#}V!I`D|Xlp-=iEs1~ymZ(2yT%?f`n=|lwv>m@DTFf1J2VacUfuE0s>gS&Q z@0!Iy+gSlVmZgxNl`~vFE3dCKc@M&PG1$+S9RZ9Rx(%Hvap%QT-cPG(5ayX17bV8kgaA^S+#Qm!hNnhjv+8k+lGx z4Yw?VUU}u=He!O^+?_$8_~l(qN2Lct!LgH2vVZY~C)kKC#R2I2Y5|p5aq*E|RnHcs zIb`8v`<^YwEb4iLU2lIdyJC8LUqT}U1{i>@z)gnh{(matmh{Y4!pm!Ed^DDM{5pS; z&{=_Bn8oVgeJzRfCNZ4H7+Ix97`E;(u%ybcCNdijII)eB_WCZBDRD;;68ngln#wWz_BFm1X5@=hs8y1~AcvHK0k1vf*7o7b2@Fi*XGAdRW z{wN+@Fut@8mN9Dh^R4_&^HEnsco%$W7(TBg{DK}KYz=vCAaoxG5x~1J?yvVW!yD#9 zR`Q$$g@wMFBEyFQ=yaNBIQY*4b8*ROpI4Ek`v03C8-X6)PcbW3+$PE}id<v# z4TzY!Z}_q~J*IM??qi#4@?eLP^>bK;X?deD8epJ^L7gl@phq~h@;lkL>#F(v6M>MF zOB#VDgsW079yrUb5#`&JqqKb=H4vlP_4NgZ&kXRlU?#bK{L2W%pnb{ zkTcZPihfCIXEsK z?>$9cmHDHCFqel+{P2=DPOf;qXQr|MXk1dkH=kY2QvI9)&nQ%cFRS0*?Az_#XK}Dt z48LqmK$4s+8r@qy@wHb|`Mzspk9E^}ZU@UgY~IW%`;b>@1xDL6i$N3#LkIM*Ve5Uo9D$4dT|j9=&p#kS~ z6pjZyA>l{)_rNxq<3!GnJ7B#*+%SAk%?7I7Bo{`hwK7X&hVmT^yH`OV0V|5NItZbO zUiz=hmSNv+n1rNjtUh5}RyEh-IU)+elfmzZsq>*Jnt%$OQAzOrH9y#aah#`xuw?6+ zWTyIK7QXa9%Xj}isYFmk#X1`6j^byN=D_l~=I`!aP9V?v!XIEf=TFG z%=*JpbIZBeag$fKBFTx~PMh zgU?HW51`NKGz*FU%x=t3j>pnZtpt`1cVblXF=QXEx%Y9JsP^f+ueYjOek~gPjckhn z-5TOCjUe>5;<{cTU^C*#-7mpAQJ_9`sd+WOQh}Kg2C2cz6>~6e}6fOt7xH zM%9MmFqUqpbQIluJm!_VQL;3FphqFa2-r#;ltY!qGKYkkta!&|F-8AP*O!ej3Cq zFf=sXQ2`}(wPJ%T`B;WGF=tg2mMJa}qz+qz#QP{BTyJMRIW+Hd`Ef&`S6m9cgxmiy*7y=s%W zv~*&QxXlaWDZLZ_rg3QvaeCS9Ra(9#-06>snYn{jiseDuag2l{7dhJ+@>Z&qyd7+v z+kM^|1Z2R3gv6Mb`kNkOu2)3pYGJm3)$ID}gv}C3rP)I5GA6jo$Yco)=|$pny#gC; zhcCYV&k5tQQ5Aj9F6#f??l)7uZkIE0dnYGxoY{#x7(2J}~`Bk(uBy!;jQ zjbMvmeQF)!KM+ZU-+z0}RVS|~g1s7kO7I^Dt;T8Cb7jB`EW%8Km9#C8ldWEPL7U+{xlQJjPZ&!lsDJZBqYpM78WRFTakTz zIN_0L6HfG!uJ4p_GDy$P&Q7|J@Uj~kblw=8Pi3V(vKOmAJXT1U_hH{omuPXic3||D zXcf7+cTYF!X5pJ?ze!L@IXiQA8DC33qRftp!d?L$qJ;_yTy7_U0!1}7c^8+Or51-u z2VLVQRx~Oqs)6BQncK+%YkT|N#5V>ShK5n!nbmWfnn>54RjThKdilP*rhBRSazHYJmaiuwS&ec;<+5Tv2qH;x}HEFVP^yH(k~Q}4Ig`G|Gw z|0qgTT>LHa z>(`ULyjVmKd{5g$L+^U%OyLan<3(*v4f}C0!mEC{u|v}RrBZc8MotUJ5zw^5EgpEg z8?%}5BjRQ}e&x*4%f2ja&}ONXgrP51Ve#UxEmgIs=#&m*|z#*ceKNT0a?Tzc!xN15Nhf1no>&fTR?bQ7-FjPFX^3{Atj-i`NqG0 z!RI8M8klPU4ao4A&myoj6jyF;G>y*2jz~g8L<9k(q@)B|Pr#zvJ37)i_{!ffGp%T) zmeofA+(s_FLEeY^hhHhJR(SHeJKbCY7`S2Ycia&FlxMUI?;HUOc^=)CmsXCeQKwt| zNT3)RiI|M@oxg8ur91bx4;=eHWZpF$akE_vOQ<4htZID>`6(joo)nU+uGqwB50SlK zKF#z6fzGcFwdO(?5Q!;>f&#d>Ncld8=N$eqZVjC$JwF$<4LkeFw$R-zeOX^xI$Z8A zEsY2&$iu$`YZ?NED)0yc4v}tErsqdh4n&jfxsi8QA!3NcG!&6H^Lp3^&E=P0?Abt{ zF6xQvRSf*+M%_SN3G;f(oF%utTd~7%3*Fn>>*@}{nkij;xVtw0^+&zRKlivfHj%O& z(mC2jG$wXU36~2OR9sQfmp=Jk-;j&L?_wf*1K8IBBvLOi=w!bMjV!ZnjX>9ht_yL# z&EEUL9|AekN_m;JlfY8Gdhjh7HAN(nV03l!sbU00IMU@VC+s7pJRVu#Sfx=<-C%^E z=OwDR_`+8kQu9Sn#P`mouPgO-Ni7vsRrm)Y!d2UQDB8rlNMfdzf&oK83wjb?kUQ#~ zbA-_z9CK}PsCW`Yhr_8a$xzC``4 zn4Fjue!od-?+Yd0VULwsiAmdQb79MGsAmSgyeL(@C(e+Plj5oR177-CFq-UQj_Gl@ z7;<;is{ZEq=&0}JbnEnNm;)_?V6NDIjtm39NU3pvfoO}Ao3@b&jlVJcl&XQJ$50-NbD@K+}^6yNt55pNsfI)HFemxL~v_(l)N_)ZepR)iYZjz** zT}3Zn0wC}vKZ3l;l33@?)Y&`OkpAVJ&x`{C)p@KUHtciM22L%}xH!#8ro1S-ogs2O z^gq*ju+XVGoH;k{FK7ftFpa&TFK#`^E&^Lu{sF zP6n+W4qa7!LkVm>4R|OhC}%lql)?W%jH7Zz%dS$4LIEXDhL9jMyihBentocU$T;yK z&&)3e3&TUw=Qb;<gua}ke#mj+o8sTdvE{jH z1!)P=xN(w+$_k#ir~BWY;>+simKPWpvWAA~+~om8&N@Oy!)g{8H(1QWNgPQg`j^6I z=jR)@`(vc~A)J5&n}9tCROV-oqa)sc3aYZ5dDkesA!+9y{FmTZZUHVQc4R~N{SA-A zqWiC0*^eqvP=pfRZ)dMKe5x4DPl2;`bJG?Wl6`RJWO%08|N8yZu15m($4M8TecAtseK2V~6w=wbvt!9BB4VJXq;%Tc;kC($O`Wq%0yUlwQFm7IB)jzO?0B25mNmT8 z=%ip^K=CJ2EYd0qJS!|l^I82+vU^_lbc&|MxbwQR`!xp0+SD0W>?##>EjjH z6Oy2RN!u4;gwey9g<7ky1^^5o)Ext&SArhOnAub7fGTbmRl zA22OSoAFFA6HVdfnVygUggn#1=!Uww^%FFS-htD#J~*9~c^B^E@lQ`^ZX3MvUAJw!W zf#){(&ym+MD&O{9IO&A=#rrXeiRG7hy!)_3O~mUiZmhrH9Yt~W#l+7dA+33G1#m+PU{K|Egm;w6B`uJ|DHd` zAAaTu7+g-`Wj@_!Tv`STzw+ft`>#@D2@sSQCJjC%yb=AHJlHYy65f zOlEoYXp1>G7z4g=Ag5iQo7Pz5LbY$@tFb?+m!Erl3oiuJyawnWl2rC9s}!FIzQddh z@|_M&iKM%c;8{fBWYNFMf_~dH10#xfddDitr5}@E)6Bsa#%^TU-LD6yUz|L;EX1>| z3$S&Vzk8}4G66p3n&_ds_IJ`G?&&J2X~Cd1J%nH@(;QZC|Kr0;F|p<4W4x-JYvuv! zw2(9bCt7}wY#3%&IlHfYVnRIJI<%2E8f|SMa=`O`g1NwR_A{mgWb-XSFGz~qLF#ABY!XZ**L4##)MUO+N&oGf6cD6#cZtjP^Uo4~>%edcFRUp13`QmabaCG(2z!!UW%;ZZckIS|OF-a>PIj?!LsP|5a)xCW7pG@aJG&9$~6gg_~Y8%XpTeJ;LCw>GBwESxcz}t z$c2TwCX9~3H+hb~n^f#VBS+W3GFNg;^c;w4^SQLGJj)RA%x!C1E^Yhy6O+g4&&5Ja z0#k8*e(%$DrDKXqo^BbiK@DWTdMtNOpI1h_c>-GkL#IQgyIq z@G+LdzZQWf3H-uj%_9x=pl3om63daN#qC*Q2>&dbsNiSIehJ1n|U#VvV8RZ{P}ZsL4jO3h2z5ub%D*BWE|3`eckHwag&WE1VOa7 z+5Qrf*DwAKHXq=Ey5>4-nf6)=fmjKY@#{S4Uyc?L_q4U%(w5%a1atqeojM%`qp%!D zSl@i;+=7RLy!`xT1M9zx50K4P8k639r=XyiIfMKE!j32F@i`|*6cl8j=IT&h4vTS@ zuk9*dMeyweg^fyp6xJvD2?`1dP*PINpEtT55!RPeZj)u}PhZgabO=nbh_;jV_qU<$ zO6%?_KRo7`!1W{wmKVP|s_4HU8!B(OYOu40-Dq8cX&09&=yoeazNPXbzj%7YYCc!^_{le_PuF_Okl=WII0+hvZci>-G+~C2^-RD)|cOxE!mRaXPDHsnv>_w;G4I z=l_YBKKj;Kj~S>oe7{KHgHglP{b{YEJ=uHAt&Z=orvvP}LNB?&#K3@*uoQqvDYxcUgQ!m`*A^)QNr}aL6 z9@(rCx-mcRrwK%82Hu0~uS)TO1UyBZh%qmddDqrh3gRIJ**d-A>oPHx_&=epWK{ z@2uZjsgeruquH%l%WNc3&OhPJ4RSO1lK#o++~hMGK^O7dkCxO|*3u#h?fq?fy7?O( ze4&E2cX#tTjBnpO2SW$Tjko9k4T4&BE~xn4oj>L&^0sL2;uToP=#*~~tHu;;gsLbj zNr}r`r+aBO*baF3OyflpIUL?x=~^Oy8mLRcwr1VkGs3Zr+V)?&;*v%+fB#WhWCE^Y z_zW&0l2q^R?7=|BLT#QY!PKW#8?`z*J-u6yY>oBdM_)`AMvLp&fbakVezK14lrNVB zhs6$rv-8Iwf2sox><)qln~#i~> zUFP`I#6oh=7qdfQ20A*RmYGT(Tcs3nc8wIloM$&>%5w>g;sWZ1@xJtSOW+66b}&-0 zi~DQw)+Cp(8rPTCVn0)qrWl(e2F5{iZ))J$a4Z~rO^I9NV)%h7dE`ZFV55|v2)w(&AyNg2&_NoVgbt!A_t-NeHsTO3$_kAe5g*vPz{#| z5W7ax5|yhk@C1Sgelkhh`S8PT_L`Pn(z2vp=$Kd|mwGYS zSe=mD!jp(t3e0yld7d3y!83G+?24zxS>}WiDjy(}F2M?>kkjA&{qtwXD0W^q<*q_&iux9g( zff-YKwb0$f1rhm&K62Z^5I}#x7jXG3VAxix(ZCztUbA zTE0_D(nc~vv%M$?b0({ngt@c?E33IK!f-Sare>~nP;RR~2)&`H=Y9KTX7t`r(5=hi zA-rVjn~`A@99s)2ehVhGjKogGVz_8G@6#u1a(AHNn?NLjwyI8MlbAm^!*6z0u5J9Z zt4Hzh05WHiX#g6>gwnTVu^;0Ymx67Pb zcuk57MD4X6P{pLn)>xOGiXKaJS06{)`kj$M*4H5IAbM)+3NJhT(MKFJ4xLgB%yE8R zL8%Frj1V>wp3<`1yonw|+U9^Upj*aBOH$kdWL)m4Yr=op(flfEF~d-r#pwPniLsA3 zg4yCrvFUdpr~kHP6<89#!?g-c(U^`^d%&|>)lRCvl~BNQ#A{kHAs277r}3+XZ|t_? z?no=CoL`FO(B?ozNA>SZnx}9b=5KTRTNp%Qie8(3gV)>vvlCizmt}NCXLSTYMs%ccSYRSMDvA)Q+yVa3F$oN%xeChc=V+!cn!*CKFDlrL{tS476Ijog zn!;rbVZZ5Sr%wOeco6%}uZ21rA|~||X)sN48iue2t_G=1MY){EmoJieQ-%fyiNp?k zQIGRwPBIr({YUK$#!^S~f*W*cm%8vaJ3PnhQ!Jt%a0pYSVX%G=)D^SsA1<`0VP4#G z*8W?pXY+a$iOuqHKj=`$+rPfm>A5i@#-*ooRz2rS+gE4o|`k7)y9v#CtipkiW;B5(ftYl2BaT8@l8PR!=>DgDY7B5lYsGpBQHe zNQ{<|;uEtKxFJ9zX20;<&Dkd*$ryLF1BC#abcGX2+5@An24}9{D6`KvqYzygZL%6D z1LXRJw?yKBRx-^^rZmG-o|BxG8E~xQR z3H=Z(a;&iKL_7y{;no^5|ue+P+QF@$68q?M7TCLKWX;)UiKT0A=%zol|1rbX9{ zd*fd2Y{D^~&2HyIg8tdE(yidcEOlE==og!kd7pghPS_^}MOa9P80!^O?Nzfr8hqc` z?@C$$3F*no_;hYs(J*7JjZ~n>&?C6eq}cBXw)m-n;whw;`NCf3ZeVW8qB89c$z@gZazSs3`q1Zf?u!p@HPt#*u;K5cyD9 zj*m!N2dpQ*8tA|jvABj0k6|K^+)_Ex*)IfggL3=6G)o$5crEn*IUPawfN^ef7K{(T z%PnBy{~BhEs0J&dS0gK#RlJ5*gAf@0_X8E1K_OeH16chy=-x5trHk%J-Mf2_ zMBl4_7`_~m0NC#G_)iwQ`ao8G=}~U^aq+OzNXBvPvTKHfY97_C0c32;X=+#|jWHSw5muKk4WfG(H8x0yWu@K$>U;l?_v5<4nD4cEU?m(eA)zzB1 zd718wGte}g;A?En;-dQG4-1?e?TW9#<-UYxR(n>OyGI8r*^zfKxw?za!lUHh|1sSLqTFe zVL?tuhq3pTb0s{<_$^EK&-o-4H=LUVY~p*26pMqh+ji?Q2`1qAWx5=zcd5ZD`dsvQ zNEpZRJ2(H~Y}lV)4<}Kh5)N5t^=EOvezOkCPzQ!T%nbzGK*KlQ5QgE(K3I{&N$^iN zQL(AU^8@_~q?7;wjfuOpKV0x@LN{VPcx`QMdns6DVH6qkm7peG5(b$(Me2IR3{g=o za6gDNr+%xl&>A;Iq6p6ye(I=PX+KArT9S|N%|SwtR1J+m_Feki*{2XWdjrb8eXfeC z3=q-Ts(zc~0=yiw42Q^CJ@i!R4Vyw6jZo18r? zwrc?!dblgN%YlSjEr^p=oli^SmTU9t9$} zCrQdiEpA*Q@A~FK_OnaLNk;c$Ma^3*`MrOnROpn1Kjx*knN^Y~&7tIaQ z*42fZxXNKTJm{_dpSeO7s<->gjV2PBN?i{2|A`{`9TtNJwF>uES@#ump7b6}S?6oJ zM#x_ROR3jXbmRlwZGol?`)zu6xo%-*9vL>|SuSyvah5M+fMx zo^k6PGkaov#wk{m z(9u61nwt-*prnn()jo{+-=HQK8J@6>$vBw2K>AM{LmiTe?4<|517ql__cAxy#v8tN^)wl71Eyq{~Ljs_u>Em diff --git a/tgstation.dme b/tgstation.dme index 0cbed7f72e..90f21bf649 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -562,6 +562,7 @@ #include "code\datums\components\paintable.dm" #include "code\datums\components\pellet_cloud.dm" #include "code\datums\components\phantomthief.dm" +#include "code\datums\components\pricetag.dm" #include "code\datums\components\rad_insulation.dm" #include "code\datums\components\radioactive.dm" #include "code\datums\components\remote_materials.dm" From cdb1fbb1e2d019fe86f3f6a99031a2f9ef42b1b7 Mon Sep 17 00:00:00 2001 From: shellspeed1 Date: Sun, 18 Sep 2022 21:55:10 -0700 Subject: [PATCH 03/14] port of https://github.com/tgstation/tgstation/pull/54029/files# Aka this is where we get bounty cubes and remove the public bounty console. Credit to ArcaneMusic. --- code/controllers/subsystem/economy.dm | 3 + code/game/machinery/civilian_bountys.dm | 26 ++-- .../circuitboards/computer_circuitboards.dm | 8 -- code/modules/cargo/bounty.dm | 2 +- code/modules/cargo/bounty_console.dm | 65 ---------- code/modules/cargo/exports/civilain_bounty.dm | 8 ++ .../jobs/job_types/cargo_technician.dm | 1 + .../jobs/job_types/head_of_personnel.dm | 1 + code/modules/jobs/job_types/quartermaster.dm | 1 + .../file_system/programs/cargobounty.dm | 47 ------- .../comp_board_designs_cargo.dm | 10 +- icons/obj/economy.dmi | Bin 16128 -> 16676 bytes tgstation.dme | 3 +- .../tgui/interfaces/CargoBountyConsole.js | 119 ------------------ .../tgui/interfaces/NtosBountyConsole.js | 119 ------------------ 15 files changed, 32 insertions(+), 381 deletions(-) delete mode 100644 code/modules/cargo/bounty_console.dm create mode 100644 code/modules/cargo/exports/civilain_bounty.dm delete mode 100644 code/modules/modular_computers/file_system/programs/cargobounty.dm delete mode 100644 tgui/packages/tgui/interfaces/CargoBountyConsole.js delete mode 100644 tgui/packages/tgui/interfaces/NtosBountyConsole.js diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index 3f594e170e..88255f375e 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -52,6 +52,9 @@ SUBSYSTEM_DEF(economy) ///The modifier multiplied to the value of cargo pack prices. var/pack_price_modifier = 1 + var/civ_bounty_tracker = 0 + /// Contains the message to send to newscasters about earnings, updated on price_update() + /datum/controller/subsystem/economy/Initialize(timeofday) var/budget_to_hand_out = round(budget_pool / department_accounts.len) for(var/A in department_accounts) diff --git a/code/game/machinery/civilian_bountys.dm b/code/game/machinery/civilian_bountys.dm index f8650625d7..f195bdea12 100644 --- a/code/game/machinery/civilian_bountys.dm +++ b/code/game/machinery/civilian_bountys.dm @@ -92,9 +92,12 @@ stop_sending() if(curr_bounty.can_claim()) //Pay for the bounty with the ID's department funds. - inserted_scan_id.registered_account.transfer_money(SSeconomy.get_dep_account(inserted_scan_id.registered_account.account_job.paycheck_department), curr_bounty.reward) - status_report += "Bounty Completed! [curr_bounty.reward] credits have been paid out. " + status_report += "Bounty Completed! Please send your completed bounty cube to cargo for your automated payout shortly." inserted_scan_id.registered_account.reset_bounty() + SSeconomy.civ_bounty_tracker++ + var/obj/item/bounty_cube/reward = new /obj/item/bounty_cube(drop_location()) + reward.bounty_value = curr_bounty.reward + reward.AddComponent(/datum/component/pricetag, inserted_scan_id.registered_account, 10) pad.visible_message("[pad] activates!") flick(pad.sending_state,pad) pad.icon_state = pad.idle_state @@ -146,15 +149,7 @@ var/curr_time = round(((pot_acc.bounty_timer + (5 MINUTES))-world.time)/ (1 MINUTES), 0.01) to_chat(usr, "You already have an incomplete civilian bounty, try again in [curr_time] minutes to replace it!") return FALSE - var/datum/bounty/crumbs = random_bounty(pot_acc.account_job.bounty_types) //It's a good scene from War Dogs (2016). - /*if(SSeconomy.inflation_value() > 1) //lets try not to add inflation for right now - if(istype(crumbs, /datum/bounty/item)) - var/datum/bounty/item/items = crumbs - items.required_count = max(round((items.required_count)/(SSeconomy.inflation_value()*2)), 1) - if(istype(crumbs, /datum/bounty/reagent)) - var/datum/bounty/reagent/chems = crumbs - chems.required_volume = max(round((chems.required_volume)/SSeconomy.inflation_value()*2), 1) - crumbs.reward = round(crumbs.reward/(SSeconomy.inflation_value()*2))*/ + var/datum/bounty/crumbs = random_bounty(pot_acc.account_job.bounty_types) pot_acc.bounty_timer = world.time pot_acc.civilian_bounty = crumbs if("eject") @@ -201,6 +196,15 @@ updateUsrDialog() return TRUE +///Upon completion of a civilian bounty, one of these is created. It is sold to cargo to give the cargo budget bounty money, and the person who completed it cash. +/obj/item/bounty_cube + name = "Bounty Cube" + desc = "A bundle of compressed hardlight data, containing a completed bounty. Sell this on the cargo shuttle to claim it!" + icon = 'icons/obj/economy.dmi' + icon_state = "bounty_cube" + ///Value of the bounty that this bounty cube sells for. + var/bounty_value = 0 + ///Beacon to launch a new bounty setup when activated. /obj/item/civ_bounty_beacon diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 7d23d25953..382764c586 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -352,10 +352,6 @@ name = "Bounty Pad (Computer Board)" build_path = /obj/machinery/computer/piratepad_control/civilian -// /obj/item/circuitboard/computer/bountypad -// name = "Bounty Pad (Computer Board)" -// build_path = /obj/machinery/computer/piratepad_control/civilian - /obj/item/circuitboard/computer/security/shuttle name = "Shuttlelinking Security Cameras (Computer Board)" icon_state = "generic" @@ -585,10 +581,6 @@ name = "Supply Request Console (Computer Board)" build_path = /obj/machinery/computer/cargo/request -/obj/item/circuitboard/computer/bounty - name = "Nanotrasen Bounty Console (Computer Board)" - build_path = /obj/machinery/computer/bounty - /obj/item/circuitboard/computer/ferry name = "Transport Ferry (Computer Board)" icon_state = "supply" diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm index 4b24488a08..00d07c8df1 100644 --- a/code/modules/cargo/bounty.dm +++ b/code/modules/cargo/bounty.dm @@ -78,7 +78,7 @@ GLOBAL_LIST_EMPTY(bounties_list) // Returns a new bounty of random type, but does not add it to GLOB.bounties_list. /proc/random_bounty(var/guided = 0) var/bounty_num - if(guided) + if(guided && (guided != CIV_JOB_RANDOM)) bounty_num = guided else bounty_num = rand(1,13) diff --git a/code/modules/cargo/bounty_console.dm b/code/modules/cargo/bounty_console.dm deleted file mode 100644 index b2ee0e0e1a..0000000000 --- a/code/modules/cargo/bounty_console.dm +++ /dev/null @@ -1,65 +0,0 @@ -#define PRINTER_TIMEOUT 10 - -/obj/machinery/computer/bounty - name = "\improper Nanotrasen bounty console" - desc = "Used to check and claim bounties offered by Nanotrasen" - icon_screen = "bounty" - circuit = /obj/item/circuitboard/computer/bounty - light_color = "#E2853D"//orange - var/printer_ready = 0 //cooldown var - var/static/datum/bank_account/cargocash - -/obj/machinery/computer/bounty/Initialize(mapload) - . = ..() - printer_ready = world.time + PRINTER_TIMEOUT - cargocash = SSeconomy.get_dep_account(ACCOUNT_CAR) - -/obj/machinery/computer/bounty/proc/print_paper() - new /obj/item/paper/bounty_printout(loc) - -/obj/item/paper/bounty_printout - name = "paper - Bounties" - -/obj/item/paper/bounty_printout/Initialize(mapload) - . = ..() - info = "

Nanotrasen Cargo Bounties


" - update_icon() - - for(var/datum/bounty/B in GLOB.bounties_list) - if(B.claimed) - continue - info += {"

[B.name]

-
  • Reward: [B.reward_string()]
  • -
  • Completed: [B.completion_string()]
"} - -/obj/machinery/computer/bounty/ui_interact(mob/user, datum/tgui/ui) - if(!GLOB.bounties_list.len) - setup_bounties() - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "CargoBountyConsole", name) - ui.open() - -/obj/machinery/computer/bounty/ui_data(mob/user) - var/list/data = list() - var/list/bountyinfo = list() - for(var/datum/bounty/B in GLOB.bounties_list) - bountyinfo += list(list("name" = B.name, "description" = B.description, "reward_string" = B.reward_string(), "completion_string" = B.completion_string() , "claimed" = B.claimed, "can_claim" = B.can_claim(), "priority" = B.high_priority, "bounty_ref" = REF(B))) - data["stored_cash"] = cargocash.account_balance - data["bountydata"] = bountyinfo - return data - -/obj/machinery/computer/bounty/ui_act(action,params) - if(..()) - return - switch(action) - if("ClaimBounty") - var/datum/bounty/cashmoney = locate(params["bounty"]) in GLOB.bounties_list - if(cashmoney) - cashmoney.claim() - return TRUE - if("Print") - if(printer_ready < world.time) - printer_ready = world.time + PRINTER_TIMEOUT - print_paper() - return diff --git a/code/modules/cargo/exports/civilain_bounty.dm b/code/modules/cargo/exports/civilain_bounty.dm new file mode 100644 index 0000000000..3d443fbad0 --- /dev/null +++ b/code/modules/cargo/exports/civilain_bounty.dm @@ -0,0 +1,8 @@ +/datum/export/bounty_box + cost = 1 + k_elasticity = 0 //Bounties are non-elastic funds. + unit_name = "completed bounty cube" + export_types = list(/obj/item/bounty_cube) + +/datum/export/bounty_box/get_cost(obj/item/bounty_cube/cube, allowed_categories, apply_elastic) + return cube.bounty_value diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index 1f87a5265d..f8e2f74d80 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -19,6 +19,7 @@ paycheck_department = ACCOUNT_CAR display_order = JOB_DISPLAY_ORDER_CARGO_TECHNICIAN + bounty_types = CIV_JOB_RANDOM threat = 0.2 /datum/outfit/job/cargo_tech diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index ce05f199a2..4c38fc4cf2 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -33,6 +33,7 @@ ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY) paycheck = PAYCHECK_COMMAND paycheck_department = ACCOUNT_SRV + bounty_types = CIV_JOB_RANDOM display_order = JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index 98343417c8..8ea7579127 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -27,6 +27,7 @@ ACCESS_SEC_DOORS, ACCESS_HEADS) paycheck = PAYCHECK_HARD //They can already buy stuff using cargo budget, don't give em a command-level paycheck. //alright i'll agree to that -qweq paycheck_department = ACCOUNT_CAR + bounty_types = CIV_JOB_RANDOM display_order = JOB_DISPLAY_ORDER_QUARTERMASTER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) diff --git a/code/modules/modular_computers/file_system/programs/cargobounty.dm b/code/modules/modular_computers/file_system/programs/cargobounty.dm deleted file mode 100644 index 74ac44ade3..0000000000 --- a/code/modules/modular_computers/file_system/programs/cargobounty.dm +++ /dev/null @@ -1,47 +0,0 @@ -/datum/computer_file/program/bounty - filename = "bounty" - filedesc = "Nanotrasen Bounty Hunter" - program_icon_state = "bounty" - extended_desc = "A basic interface for supply personnel to check and claim bounties." - requires_ntnet = TRUE - transfer_access = ACCESS_CARGO - size = 10 - tgui_id = "NtosBountyConsole" - ///cooldown var for printing paper sheets. - var/printer_ready = 0 - ///The cargo account for grabbing the cargo account's credits. - var/static/datum/bank_account/cargocash - -/datum/computer_file/program/bounty/proc/print_paper() - new /obj/item/paper/bounty_printout(get_turf(computer)) - -/datum/computer_file/program/bounty/ui_interact(mob/user, datum/tgui/ui) - if(!GLOB.bounties_list.len) - setup_bounties() - printer_ready = world.time + PRINTER_TIMEOUT - cargocash = SSeconomy.get_dep_account(ACCOUNT_CAR) - . = ..() - -/datum/computer_file/program/bounty/ui_data(mob/user) - var/list/data = get_header_data() - var/list/bountyinfo = list() - for(var/datum/bounty/B in GLOB.bounties_list) - bountyinfo += list(list("name" = B.name, "description" = B.description, "reward_string" = B.reward_string(), "completion_string" = B.completion_string() , "claimed" = B.claimed, "can_claim" = B.can_claim(), "priority" = B.high_priority, "bounty_ref" = REF(B))) - data["stored_cash"] = cargocash.account_balance - data["bountydata"] = bountyinfo - return data - -/datum/computer_file/program/bounty/ui_act(action,params) - if(..()) - return - switch(action) - if("ClaimBounty") - var/datum/bounty/cashmoney = locate(params["bounty"]) in GLOB.bounties_list - if(cashmoney) - cashmoney.claim() - return TRUE - if("Print") - if(printer_ready < world.time) - printer_ready = world.time + PRINTER_TIMEOUT - print_paper() - return diff --git a/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo.dm b/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo.dm index f2514b6f9c..ea8e59a6b3 100644 --- a/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo.dm +++ b/code/modules/research/designs/comp_board_designs/comp_board_designs_cargo.dm @@ -17,15 +17,7 @@ build_path = /obj/item/circuitboard/computer/cargo/request category = list("Computer Boards") departmental_flags = DEPARTMENTAL_FLAG_CARGO - -/datum/design/board/bounty - name = "Computer Design (Bounty Console)" - desc = "Allows for the construction of circuit boards used to build a Bounty Console." - id = "bounty" - build_path = /obj/item/circuitboard/computer/bounty - category = list("Computer Boards") - departmental_flags = DEPARTMENTAL_FLAG_CARGO - + /datum/design/board/mining name = "Computer Design (Outpost Status Display)" desc = "Allows for the construction of circuit boards used to build an outpost status display console." diff --git a/icons/obj/economy.dmi b/icons/obj/economy.dmi index a73f50ef7f063b6a51aa7d7e8da31fbf9268f68c..c8ac3c142cc7aa459b58b7d6e82eda4b2ba756f5 100644 GIT binary patch literal 16676 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 literal 16128 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 MoSJNzv`Nta0q6k}S^xk5 diff --git a/tgstation.dme b/tgstation.dme index 90f21bf649..334c6f8985 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1937,7 +1937,6 @@ #include "code\modules\buildmode\submodes\throwing.dm" #include "code\modules\buildmode\submodes\variable_edit.dm" #include "code\modules\cargo\bounty.dm" -#include "code\modules\cargo\bounty_console.dm" #include "code\modules\cargo\centcom_podlauncher.dm" #include "code\modules\cargo\console.dm" #include "code\modules\cargo\coupon.dm" @@ -1974,6 +1973,7 @@ #include "code\modules\cargo\bounties\slime.dm" #include "code\modules\cargo\bounties\special.dm" #include "code\modules\cargo\bounties\virus.dm" +#include "code\modules\cargo\exports\civilain_bounty.dm" #include "code\modules\cargo\exports\engineering.dm" #include "code\modules\cargo\exports\food_wine.dm" #include "code\modules\cargo\exports\gear.dm" @@ -2972,7 +2972,6 @@ #include "code\modules\modular_computers\file_system\programs\borg_monitor.dm" #include "code\modules\modular_computers\file_system\programs\budgetordering.dm" #include "code\modules\modular_computers\file_system\programs\card.dm" -#include "code\modules\modular_computers\file_system\programs\cargobounty.dm" #include "code\modules\modular_computers\file_system\programs\configurator.dm" #include "code\modules\modular_computers\file_system\programs\crewmanifest.dm" #include "code\modules\modular_computers\file_system\programs\file_browser.dm" diff --git a/tgui/packages/tgui/interfaces/CargoBountyConsole.js b/tgui/packages/tgui/interfaces/CargoBountyConsole.js deleted file mode 100644 index ad485231eb..0000000000 --- a/tgui/packages/tgui/interfaces/CargoBountyConsole.js +++ /dev/null @@ -1,119 +0,0 @@ -import { useBackend } from '../backend'; -import { AnimatedNumber, Box, Button, Section, Table } from '../components'; -import { formatMoney } from '../format'; -import { Window } from '../layouts'; - -export const CargoBountyConsole = (props, context) => { - const { act, data } = useBackend(context); - const { - bountydata = [], - } = data; - return ( - - -
} - buttons={( -
-
-
- ); -}; - -const BountyHeader = (props, context) => { - const { act, data } = useBackend(context); - const { - stored_cash, - } = data; - return ( - - formatMoney(value)} /> - {' credits'} - - ); -}; diff --git a/tgui/packages/tgui/interfaces/NtosBountyConsole.js b/tgui/packages/tgui/interfaces/NtosBountyConsole.js deleted file mode 100644 index bfd2b0e4c9..0000000000 --- a/tgui/packages/tgui/interfaces/NtosBountyConsole.js +++ /dev/null @@ -1,119 +0,0 @@ -import { useBackend } from '../backend'; -import { AnimatedNumber, Box, Button, Section, Table } from '../components'; -import { formatMoney } from '../format'; -import { NtosWindow } from '../layouts'; - -export const NtosBountyConsole = (props, context) => { - const { act, data } = useBackend(context); - const { - bountydata = [], - } = data; - return ( - - -
} - buttons={( -
-
-
- ); -}; - -const BountyHeader = (props, context) => { - const { act, data } = useBackend(context); - const { - stored_cash, - } = data; - return ( - - formatMoney(value)} /> - {' credits'} - - ); -}; From aa7252ffd6eadeb6b58685cb56d677b03f66d285 Mon Sep 17 00:00:00 2001 From: shellspeed1 Date: Sun, 18 Sep 2022 22:13:44 -0700 Subject: [PATCH 04/14] port of https://github.com/Skyrat-SS13/Skyrat-tg/commit/418c58a9c3c8b78c0577e150ad891aba8d7a7731 to make pad deconstructible. --- code/game/machinery/civilian_bountys.dm | 2 +- code/modules/economy/account.dm | 4 ++-- code/modules/events/pirates.dm | 20 ++++++++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/civilian_bountys.dm b/code/game/machinery/civilian_bountys.dm index f195bdea12..1173faa5d8 100644 --- a/code/game/machinery/civilian_bountys.dm +++ b/code/game/machinery/civilian_bountys.dm @@ -150,7 +150,7 @@ to_chat(usr, "You already have an incomplete civilian bounty, try again in [curr_time] minutes to replace it!") return FALSE var/datum/bounty/crumbs = random_bounty(pot_acc.account_job.bounty_types) - pot_acc.bounty_timer = world.time + COOLDOWN_START(pot_acc, bounty_timer, 5 MINUTES) pot_acc.civilian_bounty = crumbs if("eject") id_eject(usr, inserted_scan_id) diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index 7ebf9468ac..af3eced8db 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -11,7 +11,7 @@ var/being_dumped = FALSE //pink levels are rising var/withdrawDelay = 0 var/datum/bounty/civilian_bounty - var/bounty_timer = 0 + COOLDOWN_DECLARE(bounty_timer) /datum/bank_account/New(newname, job) if(add_to_accounts) @@ -141,7 +141,7 @@ */ /datum/bank_account/proc/reset_bounty() civilian_bounty = null - bounty_timer = 0 + COOLDOWN_RESET(src, bounty_timer) /datum/bank_account/department account_holder = "Guild Credit Agency" diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index bf6026300f..f68e8f8b18 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -264,6 +264,17 @@ I.buffer = src return TRUE +/obj/machinery/piratepad/screwdriver_act_secondary(mob/living/user, obj/item/screwdriver/screw) + . = ..() + if(!.) + return default_deconstruction_screwdriver(user, "lpad-idle-open", "lpad-idle-off", screw) + +/obj/machinery/piratepad/crowbar_act_secondary(mob/living/user, obj/item/tool) + . = ..() + default_deconstruction_crowbar(tool) + return TRUE + + /obj/machinery/computer/piratepad_control name = "cargo hold control terminal" var/status_report = "Ready for delivery." @@ -390,6 +401,15 @@ sending = FALSE /obj/machinery/computer/piratepad_control/proc/start_sending() + var/obj/machinery/piratepad/pad = pad_ref?.resolve() + if(!pad) + status_report = "No pad detected. Build or link a pad." + pad.audible_message(span_notice("[pad] beeps.")) + return + if(pad?.panel_open) + status_report = "Please screwdrive pad closed to send. " + pad.audible_message(span_notice("[pad] beeps.")) + return if(sending) return sending = TRUE From 40dc7d57c32fd7bf67a2f578ed64d2c5b6284f32 Mon Sep 17 00:00:00 2001 From: shellspeed1 Date: Sun, 18 Sep 2022 22:40:07 -0700 Subject: [PATCH 05/14] port of https://github.com/tgstation/tgstation/pull/55762, credit to ArcaneMusic. --- code/game/machinery/civilian_bountys.dm | 57 +++++-- code/modules/economy/account.dm | 1 + code/modules/events/pirates.dm | 6 +- .../tgui/interfaces/CivCargoHoldTerminal.js | 146 ++++++++++-------- 4 files changed, 133 insertions(+), 77 deletions(-) diff --git a/code/game/machinery/civilian_bountys.dm b/code/game/machinery/civilian_bountys.dm index 1173faa5d8..e983afeed1 100644 --- a/code/game/machinery/civilian_bountys.dm +++ b/code/game/machinery/civilian_bountys.dm @@ -104,6 +104,32 @@ playsound(loc, 'sound/machines/synth_yes.ogg', 30 , TRUE) sending = FALSE +///Here is where cargo bounties are added to the player's bank accounts, then adjusted and scaled into a civilian bounty. +/obj/machinery/computer/piratepad_control/civilian/proc/add_bounties() + if(!inserted_scan_id || !inserted_scan_id.registered_account) + return + var/datum/bank_account/pot_acc = inserted_scan_id.registered_account + if(pot_acc.civilian_bounty && ((world.time) < pot_acc.bounty_timer + 5 MINUTES)) + var/curr_time = round(((pot_acc.bounty_timer + (5 MINUTES))-world.time)/ (1 MINUTES), 0.01) + to_chat(usr, "Internal ID network spools coiling, try again in [curr_time] minutes!") + return FALSE + if(!pot_acc.account_job) + to_chat(usr, "The console smartly rejects your ID card, as it lacks a job assignment!") + return FALSE + var/list/datum/bounty/crumbs = list(random_bounty(pot_acc.account_job.bounty_types), // We want to offer 2 bounties from their appropriate job catagories + random_bounty(pot_acc.account_job.bounty_types), // and 1 guarenteed assistant bounty if the other 2 suck. + random_bounty(CIV_JOB_BASIC)) + pot_acc.bounty_timer = world.time + pot_acc.bounties = crumbs + +/obj/machinery/computer/piratepad_control/civilian/proc/pick_bounty(choice) + if(inserted_scan_id?.registered_account) + playsound(loc, 'sound/machines/synth_no.ogg', 40 , TRUE) + return + inserted_scan_id.registered_account.civilian_bounty = inserted_scan_id.registered_account.bounties[choice] + inserted_scan_id.registered_account.bounties = null + return inserted_scan_id.registered_account.civilian_bounty + /obj/machinery/computer/piratepad_control/civilian/AltClick(mob/user) . = ..() id_eject(user, inserted_scan_id) @@ -122,9 +148,20 @@ data["status_report"] = status_report data["id_inserted"] = inserted_scan_id if(inserted_scan_id && inserted_scan_id.registered_account) - data["id_bounty_info"] = inserted_scan_id.registered_account.bounty_text() - data["id_bounty_num"] = inserted_scan_id.registered_account.bounty_num() - data["id_bounty_value"] = inserted_scan_id.registered_account.bounty_value() + if(inserted_scan_id.registered_account.civilian_bounty) + data["id_bounty_info"] = inserted_scan_id.registered_account.civilian_bounty.description + data["id_bounty_num"] = inserted_scan_id.registered_account.bounty_num() + data["id_bounty_value"] = inserted_scan_id.registered_account.civilian_bounty.reward + if(inserted_scan_id.registered_account.bounties) + data["picking"] = TRUE + data["id_bounty_names"] = list(inserted_scan_id.registered_account.bounties[1].name, + inserted_scan_id.registered_account.bounties[2].name, + inserted_scan_id.registered_account.bounties[3].name) + data["id_bounty_values"] = list(inserted_scan_id.registered_account.bounties[1].reward, + inserted_scan_id.registered_account.bounties[2].reward, + inserted_scan_id.registered_account.bounties[3].reward) + else + data["picking"] = FALSE return data /obj/machinery/computer/piratepad_control/civilian/ui_act(action, params) @@ -141,19 +178,13 @@ start_sending() if("stop") stop_sending() + if("pick") + pick_bounty(params["value"]) if("bounty") - if(!inserted_scan_id || !inserted_scan_id.registered_account) - return - var/datum/bank_account/pot_acc = inserted_scan_id.registered_account - if(pot_acc.civilian_bounty && ((world.time) < pot_acc.bounty_timer + 5 MINUTES)) - var/curr_time = round(((pot_acc.bounty_timer + (5 MINUTES))-world.time)/ (1 MINUTES), 0.01) - to_chat(usr, "You already have an incomplete civilian bounty, try again in [curr_time] minutes to replace it!") - return FALSE - var/datum/bounty/crumbs = random_bounty(pot_acc.account_job.bounty_types) - COOLDOWN_START(pot_acc, bounty_timer, 5 MINUTES) - pot_acc.civilian_bounty = crumbs + add_bounties() if("eject") id_eject(usr, inserted_scan_id) + inserted_scan_id = null . = TRUE ///Self explanitory, holds the ID card inthe console for bounty payout and manipulation. diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index af3eced8db..18fdfd2667 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -11,6 +11,7 @@ var/being_dumped = FALSE //pink levels are rising var/withdrawDelay = 0 var/datum/bounty/civilian_bounty + var/list/datum/bounty/bounties COOLDOWN_DECLARE(bounty_timer) /datum/bank_account/New(newname, job) diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index f68e8f8b18..749c2e4f3e 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -264,12 +264,12 @@ I.buffer = src return TRUE -/obj/machinery/piratepad/screwdriver_act_secondary(mob/living/user, obj/item/screwdriver/screw) +/obj/machinery/piratepad/screwdriver_act(mob/living/user, obj/item/screwdriver/screw) . = ..() if(!.) return default_deconstruction_screwdriver(user, "lpad-idle-open", "lpad-idle-off", screw) -/obj/machinery/piratepad/crowbar_act_secondary(mob/living/user, obj/item/tool) +/obj/machinery/piratepad/crowbar_act(mob/living/user, obj/item/tool) . = ..() default_deconstruction_crowbar(tool) return TRUE @@ -285,6 +285,8 @@ var/datum/export_report/total_report var/sending_timer var/cargo_hold_id + ///Reference to the specific pad that the control computer is linked up to. + var/datum/weakref/pad_ref /obj/machinery/computer/piratepad_control/Initialize(mapload) ..() diff --git a/tgui/packages/tgui/interfaces/CivCargoHoldTerminal.js b/tgui/packages/tgui/interfaces/CivCargoHoldTerminal.js index 42fc0d8bbb..fb6954a347 100644 --- a/tgui/packages/tgui/interfaces/CivCargoHoldTerminal.js +++ b/tgui/packages/tgui/interfaces/CivCargoHoldTerminal.js @@ -1,75 +1,63 @@ -import { Fragment } from 'inferno'; import { useBackend } from '../backend'; -import { Button, Flex, LabeledList, NoticeBox, Section } from '../components'; +import { Box, Button, Flex, LabeledList, NoticeBox, Section } from '../components'; import { Window } from '../layouts'; export const CivCargoHoldTerminal = (props, context) => { const { act, data } = useBackend(context); - const { - pad, - sending, - status_report, - id_inserted, - id_bounty_info, - id_bounty_value, - id_bounty_num, - } = data; - const in_text = "Welcome valued employee."; - const out_text = "To begin, insert your ID into the console."; + const { pad, sending, status_report, id_inserted, id_bounty_info, picking } = + data; + const in_text = 'Welcome valued employee.'; + const out_text = 'To begin, insert your ID into the console.'; return ( - + - + {id_inserted ? in_text : out_text} -
+
+
- - - - - + + + + + + + + +
+ ); +}; From 95a775edf1df229be6b0fee0c2b3ccb104c3c75c Mon Sep 17 00:00:00 2001 From: shellspeed1 Date: Sun, 18 Sep 2022 23:04:29 -0700 Subject: [PATCH 06/14] woopsie I forgot map stuff --- .../Mining_Station_Public_01.dmm | 6 +-- _maps/map_files/BoxStation/BoxStation.dmm | 17 +------ _maps/map_files/CogStation/CogStation.dmm | 11 ++--- .../map_files/Deltastation/DeltaStation2.dmm | 29 ++---------- _maps/map_files/KiloStation/KiloStation.dmm | 46 +++++++++--------- _maps/map_files/LambdaStation/lambda.dmm | 26 ++++------ _maps/map_files/MetaStation/MetaStation.dmm | 19 +++----- _maps/map_files/OmegaStation/OmegaStation.dmm | 20 ++++---- _maps/map_files/PubbyStation/PubbyStation.dmm | 47 +++++++++---------- _maps/map_files/Snaxi/Snaxi.dmm | 23 +++------ 10 files changed, 82 insertions(+), 162 deletions(-) diff --git a/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm b/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm index 69cf7c0867..79d49dc6cf 100644 --- a/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm +++ b/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm @@ -2714,10 +2714,6 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) -"OI" = ( -/obj/machinery/mineral/mint, -/turf/open/floor/plasteel, -/area/mine/production) "ON" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/brown{ @@ -7031,7 +7027,7 @@ xv bg mI Cd -OI +es sz gk Wf diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index b007c1a194..7ce6f8e121 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -29095,9 +29095,6 @@ /turf/open/floor/plasteel/white, /area/science) "btB" = ( -/obj/machinery/computer/bounty{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -30017,9 +30014,6 @@ departmentType = 2; pixel_x = -30 }, -/obj/machinery/computer/bounty{ - dir = 4 - }, /obj/effect/turf_decal/tile/brown{ dir = 1 }, @@ -63578,15 +63572,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"sWR" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/computer/bounty{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/cargo/office) "sXy" = ( /obj/machinery/door/airlock/external{ name = "Security External Airlock"; @@ -90004,7 +89989,7 @@ bnG bnz bpA bbR -sWR +bkM jlm bud eyM diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm index 6f1ec5682b..76a6007297 100644 --- a/_maps/map_files/CogStation/CogStation.dmm +++ b/_maps/map_files/CogStation/CogStation.dmm @@ -21245,9 +21245,6 @@ /turf/open/floor/plasteel/dark/side, /area/security/courtroom) "aUF" = ( -/obj/machinery/computer/bounty{ - dir = 1 - }, /turf/open/floor/carpet/green, /area/command/heads_quarters/hop) "aUG" = ( @@ -26769,7 +26766,6 @@ /turf/open/floor/engine, /area/engineering/teg) "bgS" = ( -/obj/machinery/computer/bounty, /obj/effect/turf_decal/tile/brown{ dir = 4 }, @@ -27425,6 +27421,9 @@ dir = 1; pixel_y = -22 }, +/obj/machinery/computer/piratepad_control/civilian{ + dir = 1 + }, /turf/open/floor/plasteel, /area/cargo/office) "bis" = ( @@ -29094,9 +29093,6 @@ /turf/open/floor/plasteel, /area/cargo/sorting) "blR" = ( -/obj/machinery/computer/bounty{ - dir = 4 - }, /obj/effect/turf_decal/tile/brown{ dir = 8 }, @@ -58020,6 +58016,7 @@ /obj/effect/turf_decal/tile/brown, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/structure/disposalpipe/segment, +/obj/machinery/piratepad/civilian, /turf/open/floor/plasteel, /area/cargo/office) "ctx" = ( diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 776e50e9a5..ba74017e77 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -14448,9 +14448,6 @@ /turf/closed/wall, /area/hallway/primary/fore) "bdO" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, /obj/machinery/light{ dir = 8 }, @@ -14467,20 +14464,19 @@ /obj/effect/turf_decal/tile/brown{ dir = 8 }, +/obj/machinery/computer/piratepad_control/civilian, /turf/open/floor/plasteel, /area/hallway/primary/fore) "bdP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, /obj/effect/turf_decal/tile/brown{ dir = 1 }, /obj/effect/turf_decal/tile/brown{ dir = 4 }, +/obj/machinery/piratepad/civilian, /turf/open/floor/plasteel, /area/hallway/primary/fore) "bdQ" = ( @@ -73855,16 +73851,6 @@ }, /turf/open/floor/plasteel, /area/engineering/main) -"fdZ" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/computer/bounty{ - dir = 8 - }, -/turf/open/floor/plasteel/grimy, -/area/command/heads_quarters/hop) "fer" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -74410,9 +74396,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/computer/bounty{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -115753,9 +115736,6 @@ /obj/machinery/light_switch{ pixel_x = 23 }, -/obj/machinery/computer/bounty{ - dir = 8 - }, /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -121652,9 +121632,6 @@ name = "Station Intercom (General)"; pixel_x = 28 }, -/obj/machinery/computer/bounty{ - dir = 8 - }, /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -165088,7 +165065,7 @@ xmR qTU xmR wGq -fdZ +xmR kxP pnQ gEc diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 37a0292f45..7c8fdb8fbe 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -12343,6 +12343,7 @@ /obj/machinery/light{ dir = 4 }, +/obj/structure/closet/firecloset, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "auA" = ( @@ -13135,9 +13136,6 @@ /turf/open/floor/plasteel, /area/command/bridge) "avS" = ( -/obj/machinery/computer/bounty{ - dir = 4 - }, /obj/machinery/requests_console{ announcementConsole = 1; department = "Head of Personnel's Desk"; @@ -35252,7 +35250,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/structure/closet/firecloset, +/obj/machinery/piratepad/civilian, /turf/open/floor/plasteel/dark, /area/hallway/primary/starboard) "beP" = ( @@ -37144,7 +37142,6 @@ /turf/open/floor/plasteel, /area/cargo/miningoffice) "bhO" = ( -/obj/machinery/computer/bounty, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -38740,9 +38737,6 @@ dir = 4 }, /obj/effect/turf_decal/bot, -/obj/machinery/computer/bounty{ - dir = 8 - }, /turf/open/floor/plasteel/dark, /area/cargo/office) "bks" = ( @@ -42090,8 +42084,10 @@ /turf/open/floor/plasteel, /area/cargo/storage) "bpF" = ( -/obj/structure/sign/departments/cargo, -/turf/closed/wall, +/obj/machinery/computer/piratepad_control/civilian{ + dir = 8 + }, +/turf/open/floor/plasteel, /area/hallway/primary/starboard) "bpG" = ( /obj/effect/turf_decal/tile/neutral, @@ -43729,7 +43725,7 @@ }, /obj/item/reagent_containers/food/drinks/beer{ desc = "A station exclusive. Consumpt may result in seizures, blindness, drunkenness, or even death."; - list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko = 10); + list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko=10); name = "Kilo-Kocktail"; pixel_x = 5; pixel_y = 5 @@ -49266,10 +49262,6 @@ /area/security/checkpoint/supply) "bBp" = ( /obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -84892,7 +84884,7 @@ /obj/item/reagent_containers/food/drinks/bottle/grenadine, /obj/item/reagent_containers/food/drinks/beer{ desc = "A station exclusive. Consumpt may result in seizures, blindness, drunkenness, or even death."; - list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko = 10); + list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko=10); name = "Kilo-Kocktail"; pixel_x = 5; pixel_y = 5 @@ -84976,56 +84968,56 @@ /obj/item/reagent_containers/food/drinks/bottle/wine, /obj/item/reagent_containers/food/drinks/beer{ desc = "A station exclusive. Consumpt may result in seizures, blindness, drunkenness, or even death."; - list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko = 10); + list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko=10); name = "Kilo-Kocktail"; pixel_x = 5; pixel_y = 5 }, /obj/item/reagent_containers/food/drinks/beer{ desc = "A station exclusive. Consumpt may result in seizures, blindness, drunkenness, or even death."; - list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko = 10); + list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko=10); name = "Kilo-Kocktail"; pixel_x = 5; pixel_y = 5 }, /obj/item/reagent_containers/food/drinks/beer{ desc = "A station exclusive. Consumpt may result in seizures, blindness, drunkenness, or even death."; - list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko = 10); + list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko=10); name = "Kilo-Kocktail"; pixel_x = 5; pixel_y = 5 }, /obj/item/reagent_containers/food/drinks/beer{ desc = "A station exclusive. Consumpt may result in seizures, blindness, drunkenness, or even death."; - list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko = 10); + list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko=10); name = "Kilo-Kocktail"; pixel_x = 5; pixel_y = 5 }, /obj/item/reagent_containers/food/drinks/beer{ desc = "A station exclusive. Consumpt may result in seizures, blindness, drunkenness, or even death."; - list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko = 10); + list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko=10); name = "Kilo-Kocktail"; pixel_x = 5; pixel_y = 5 }, /obj/item/reagent_containers/food/drinks/beer{ desc = "A station exclusive. Consumpt may result in seizures, blindness, drunkenness, or even death."; - list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko = 10); + list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko=10); name = "Kilo-Kocktail"; pixel_x = 5; pixel_y = 5 }, /obj/item/reagent_containers/food/drinks/beer{ desc = "A station exclusive. Consumpt may result in seizures, blindness, drunkenness, or even death."; - list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko = 10); + list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko=10); name = "Kilo-Kocktail"; pixel_x = 5; pixel_y = 5 }, /obj/item/reagent_containers/food/drinks/beer{ desc = "A station exclusive. Consumpt may result in seizures, blindness, drunkenness, or even death."; - list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko = 10); + list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko=10); name = "Kilo-Kocktail"; pixel_x = 5; pixel_y = 5 @@ -85064,6 +85056,10 @@ "khA" = ( /turf/closed/wall/rust, /area/construction/mining/aux_base) +"kmy" = ( +/obj/structure/sign/departments/cargo, +/turf/closed/wall, +/area/cargo/office) "koc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /turf/open/floor/wood, @@ -122842,7 +122838,7 @@ aYK aYd bhe cLt -bhI +kmy bhX bhs biM diff --git a/_maps/map_files/LambdaStation/lambda.dmm b/_maps/map_files/LambdaStation/lambda.dmm index 97a17ff303..12bc9b783c 100644 --- a/_maps/map_files/LambdaStation/lambda.dmm +++ b/_maps/map_files/LambdaStation/lambda.dmm @@ -13514,7 +13514,7 @@ }, /mob/living/simple_animal/pet/gondola{ desc = "The last known gondola for lightyears, it is your duty to keep them safe from the filthy yellowed hands of the greytide."; - loot = list(/obj/effect/decal/cleanable/blood/gibs, /obj/item/stack/sheet/animalhide/gondola = 1); + loot = list(/obj/effect/decal/cleanable/blood/gibs,/obj/item/stack/sheet/animalhide/gondola=1); name = "Filbert" }, /turf/open/floor/plasteel/dark, @@ -23373,9 +23373,6 @@ /turf/open/floor/plasteel, /area/cargo/miningoffice) "aQs" = ( -/obj/machinery/computer/bounty{ - dir = 4 - }, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 }, @@ -24351,12 +24348,10 @@ /turf/open/floor/plasteel, /area/hallway/primary/fore) "aTo" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 }, +/obj/machinery/piratepad/civilian, /turf/open/floor/plasteel, /area/hallway/primary/central) "aTp" = ( @@ -25014,9 +25009,6 @@ name = "Station Intercom"; pixel_y = -28 }, -/obj/machinery/computer/bounty{ - dir = 1 - }, /obj/machinery/light, /turf/open/floor/plasteel, /area/cargo/storage) @@ -25117,9 +25109,6 @@ /turf/open/floor/plasteel, /area/cargo/office) "aVG" = ( -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/light{ dir = 8; light_color = "#e8eaff" @@ -25127,6 +25116,9 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 }, +/obj/machinery/computer/piratepad_control/civilian{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "aVH" = ( @@ -38023,7 +38015,7 @@ dir = 5 }, /obj/machinery/vending/medical{ - products = list(/obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/dropper = 3, /obj/item/healthanalyzer = 4, /obj/item/sensor_device = 4, /obj/item/pinpointer/crew = 2, /obj/item/reagent_containers/medspray/sterilizine = 1, /obj/item/stack/medical/gauze = 8, /obj/item/reagent_containers/pill/patch/styptic = 5, /obj/item/reagent_containers/medspray/styptic = 2, /obj/item/reagent_containers/pill/patch/silver_sulf = 5, /obj/item/reagent_containers/medspray/silver_sulf = 2, /obj/item/reagent_containers/pill/insulin = 10, /obj/item/reagent_containers/pill/salbutamol = 2, /obj/item/reagent_containers/glass/bottle/charcoal = 4, /obj/item/reagent_containers/glass/bottle/epinephrine = 4, /obj/item/reagent_containers/glass/bottle/salglu_solution = 3, /obj/item/reagent_containers/glass/bottle/morphine = 4, /obj/item/reagent_containers/glass/bottle/toxin = 3, /obj/item/reagent_containers/syringe/antiviral = 6, /obj/item/storage/hypospraykit/fire = 2, /obj/item/storage/hypospraykit/toxin = 2, /obj/item/storage/hypospraykit/o2 = 2, /obj/item/storage/hypospraykit/brute = 2, /obj/item/storage/hypospraykit/enlarge = 2, /obj/item/reagent_containers/glass/bottle/vial/small = 5, /obj/item/storage/briefcase/medical = 2, /obj/item/stack/sticky_tape/surgical = 3, /obj/item/healthanalyzer/wound = 4, /obj/item/stack/medical/ointment = 2, /obj/item/stack/medical/suture = 2, /obj/item/stack/medical/bone_gel = 4) + products = list(/obj/item/reagent_containers/syringe=12,/obj/item/reagent_containers/dropper=3,/obj/item/healthanalyzer=4,/obj/item/sensor_device=4,/obj/item/pinpointer/crew=2,/obj/item/reagent_containers/medspray/sterilizine=1,/obj/item/stack/medical/gauze=8,/obj/item/reagent_containers/pill/patch/styptic=5,/obj/item/reagent_containers/medspray/styptic=2,/obj/item/reagent_containers/pill/patch/silver_sulf=5,/obj/item/reagent_containers/medspray/silver_sulf=2,/obj/item/reagent_containers/pill/insulin=10,/obj/item/reagent_containers/pill/salbutamol=2,/obj/item/reagent_containers/glass/bottle/charcoal=4,/obj/item/reagent_containers/glass/bottle/epinephrine=4,/obj/item/reagent_containers/glass/bottle/salglu_solution=3,/obj/item/reagent_containers/glass/bottle/morphine=4,/obj/item/reagent_containers/glass/bottle/toxin=3,/obj/item/reagent_containers/syringe/antiviral=6,/obj/item/storage/hypospraykit/fire=2,/obj/item/storage/hypospraykit/toxin=2,/obj/item/storage/hypospraykit/o2=2,/obj/item/storage/hypospraykit/brute=2,/obj/item/storage/hypospraykit/enlarge=2,/obj/item/reagent_containers/glass/bottle/vial/small=5,/obj/item/storage/briefcase/medical=2,/obj/item/stack/sticky_tape/surgical=3,/obj/item/healthanalyzer/wound=4,/obj/item/stack/medical/ointment=2,/obj/item/stack/medical/suture=2,/obj/item/stack/medical/bone_gel=4) }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) @@ -46027,7 +46019,7 @@ "bXK" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/vending/medical{ - products = list(/obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/dropper = 3, /obj/item/healthanalyzer = 4, /obj/item/sensor_device = 4, /obj/item/pinpointer/crew = 2, /obj/item/reagent_containers/medspray/sterilizine = 1, /obj/item/stack/medical/gauze = 8, /obj/item/reagent_containers/pill/patch/styptic = 5, /obj/item/reagent_containers/medspray/styptic = 2, /obj/item/reagent_containers/pill/patch/silver_sulf = 5, /obj/item/reagent_containers/medspray/silver_sulf = 2, /obj/item/reagent_containers/pill/insulin = 10, /obj/item/reagent_containers/pill/salbutamol = 2, /obj/item/reagent_containers/glass/bottle/charcoal = 4, /obj/item/reagent_containers/glass/bottle/epinephrine = 4, /obj/item/reagent_containers/glass/bottle/salglu_solution = 3, /obj/item/reagent_containers/glass/bottle/morphine = 4, /obj/item/reagent_containers/glass/bottle/toxin = 3, /obj/item/reagent_containers/syringe/antiviral = 6, /obj/item/storage/hypospraykit/fire = 2, /obj/item/storage/hypospraykit/toxin = 2, /obj/item/storage/hypospraykit/o2 = 2, /obj/item/storage/hypospraykit/brute = 2, /obj/item/storage/hypospraykit/enlarge = 2, /obj/item/reagent_containers/glass/bottle/vial/small = 5, /obj/item/storage/briefcase/medical = 2, /obj/item/stack/sticky_tape/surgical = 3, /obj/item/healthanalyzer/wound = 4, /obj/item/stack/medical/ointment = 2, /obj/item/stack/medical/suture = 2, /obj/item/stack/medical/bone_gel = 4) + products = list(/obj/item/reagent_containers/syringe=12,/obj/item/reagent_containers/dropper=3,/obj/item/healthanalyzer=4,/obj/item/sensor_device=4,/obj/item/pinpointer/crew=2,/obj/item/reagent_containers/medspray/sterilizine=1,/obj/item/stack/medical/gauze=8,/obj/item/reagent_containers/pill/patch/styptic=5,/obj/item/reagent_containers/medspray/styptic=2,/obj/item/reagent_containers/pill/patch/silver_sulf=5,/obj/item/reagent_containers/medspray/silver_sulf=2,/obj/item/reagent_containers/pill/insulin=10,/obj/item/reagent_containers/pill/salbutamol=2,/obj/item/reagent_containers/glass/bottle/charcoal=4,/obj/item/reagent_containers/glass/bottle/epinephrine=4,/obj/item/reagent_containers/glass/bottle/salglu_solution=3,/obj/item/reagent_containers/glass/bottle/morphine=4,/obj/item/reagent_containers/glass/bottle/toxin=3,/obj/item/reagent_containers/syringe/antiviral=6,/obj/item/storage/hypospraykit/fire=2,/obj/item/storage/hypospraykit/toxin=2,/obj/item/storage/hypospraykit/o2=2,/obj/item/storage/hypospraykit/brute=2,/obj/item/storage/hypospraykit/enlarge=2,/obj/item/reagent_containers/glass/bottle/vial/small=5,/obj/item/storage/briefcase/medical=2,/obj/item/stack/sticky_tape/surgical=3,/obj/item/healthanalyzer/wound=4,/obj/item/stack/medical/ointment=2,/obj/item/stack/medical/suture=2,/obj/item/stack/medical/bone_gel=4) }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) @@ -62219,7 +62211,7 @@ /area/engineering/break_room) "cUI" = ( /obj/machinery/vending/engineering{ - products = list(/obj/item/clothing/under/rank/engineering/engineer = 4, /obj/item/clothing/shoes/sneakers/orange = 4, /obj/item/clothing/head/hardhat = 4, /obj/item/storage/belt/utility = 4, /obj/item/clothing/glasses/meson/engine = 4, /obj/item/clothing/gloves/color/yellow = 2, /obj/item/screwdriver = 12, /obj/item/crowbar = 12, /obj/item/wirecutters = 12, /obj/item/multitool = 12, /obj/item/wrench = 12, /obj/item/t_scanner = 12, /obj/item/stock_parts/cell = 8, /obj/item/weldingtool = 8, /obj/item/clothing/head/welding = 8, /obj/item/light/tube = 10, /obj/item/clothing/suit/fire = 4, /obj/item/stock_parts/scanning_module = 5, /obj/item/stock_parts/micro_laser = 5, /obj/item/stock_parts/matter_bin = 5, /obj/item/stock_parts/manipulator = 5) + products = list(/obj/item/clothing/under/rank/engineering/engineer=4,/obj/item/clothing/shoes/sneakers/orange=4,/obj/item/clothing/head/hardhat=4,/obj/item/storage/belt/utility=4,/obj/item/clothing/glasses/meson/engine=4,/obj/item/clothing/gloves/color/yellow=2,/obj/item/screwdriver=12,/obj/item/crowbar=12,/obj/item/wirecutters=12,/obj/item/multitool=12,/obj/item/wrench=12,/obj/item/t_scanner=12,/obj/item/stock_parts/cell=8,/obj/item/weldingtool=8,/obj/item/clothing/head/welding=8,/obj/item/light/tube=10,/obj/item/clothing/suit/fire=4,/obj/item/stock_parts/scanning_module=5,/obj/item/stock_parts/micro_laser=5,/obj/item/stock_parts/matter_bin=5,/obj/item/stock_parts/manipulator=5) }, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -70184,7 +70176,7 @@ }, /obj/structure/table/wood, /obj/item/reagent_containers/food/drinks/sillycup/smallcarton{ - list_reagents = list(/datum/reagent/consumable/milk = 20); + list_reagents = list(/datum/reagent/consumable/milk=20); name = "small milk carton"; pixel_x = -8; pixel_y = 5 diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 52fe46984f..de4d12e8d5 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -1701,7 +1701,7 @@ name = "3maintenance loot spawner" }, /obj/effect/spawner/lootdrop/armory_contraband{ - loot = list(/obj/item/gun/ballistic/automatic/pistol = 5, /obj/item/gun/ballistic/shotgun/automatic/combat = 5, /obj/item/gun/ballistic/revolver/mateba, /obj/item/gun/ballistic/automatic/pistol/deagle, /obj/item/storage/box/syndie_kit/throwing_weapons = 3) + loot = list(/obj/item/gun/ballistic/automatic/pistol=5,/obj/item/gun/ballistic/shotgun/automatic/combat=5,/obj/item/gun/ballistic/revolver/mateba,/obj/item/gun/ballistic/automatic/pistol/deagle,/obj/item/storage/box/syndie_kit/throwing_weapons=3) }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -14313,9 +14313,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "bca" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/machinery/light{ dir = 4 }, @@ -14327,6 +14324,7 @@ /obj/effect/turf_decal/tile/brown{ dir = 4 }, +/obj/machinery/piratepad/civilian, /turf/open/floor/plasteel, /area/hallway/primary/port) "bcb" = ( @@ -14593,13 +14591,13 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "bdv" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ dir = 4 }, +/obj/machinery/computer/piratepad_control/civilian{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "bdw" = ( @@ -57237,7 +57235,7 @@ "iqV" = ( /obj/structure/table/wood/poker, /obj/effect/spawner/lootdrop{ - loot = list(/obj/item/gun/ballistic/revolver/russian = 5, /obj/item/storage/box/syndie_kit/throwing_weapons, /obj/item/toy/cards/deck/syndicate = 2); + loot = list(/obj/item/gun/ballistic/revolver/russian=5,/obj/item/storage/box/syndie_kit/throwing_weapons,/obj/item/toy/cards/deck/syndicate=2); name = "gambling valuables spawner" }, /turf/open/floor/wood, @@ -65476,7 +65474,6 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/computer/bounty, /obj/effect/turf_decal/tile/brown{ dir = 1 }, @@ -72104,7 +72101,6 @@ departmentType = 2; pixel_y = 30 }, -/obj/machinery/computer/bounty, /obj/effect/turf_decal/tile/brown{ dir = 1 }, @@ -76629,9 +76625,6 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/computer/bounty{ - dir = 4 - }, /turf/open/floor/wood, /area/command/heads_quarters/hop) "tdQ" = ( diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index e681688066..acc8f9c299 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -5245,9 +5245,6 @@ name = "Cargo Office RC"; pixel_x = 32 }, -/obj/machinery/computer/bounty{ - dir = 8 - }, /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -6769,9 +6766,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard/fore) "amv" = ( -/obj/machinery/computer/bounty{ - dir = 4 - }, /obj/effect/turf_decal/tile/brown{ dir = 1 }, @@ -9011,14 +9005,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard/fore) "aqn" = ( -/obj/structure/chair{ - dir = 1 - }, /obj/machinery/airalarm{ dir = 1; pixel_y = -22 }, /obj/effect/turf_decal/bot, +/obj/machinery/piratepad/civilian, /turf/open/floor/plasteel, /area/hallway/primary/starboard/fore) "aqo" = ( @@ -10230,7 +10222,6 @@ /turf/open/floor/plasteel, /area/maintenance/starboard) "ass" = ( -/obj/machinery/mineral/mint, /obj/structure/sign/poster/official/random{ pixel_y = 32 }, @@ -38507,6 +38498,13 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/nitrous_input, /turf/open/floor/engine/n2o, /area/engineering/atmos) +"svk" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/computer/piratepad_control/civilian{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard/fore) "svX" = ( /obj/structure/sign/warning/fire{ pixel_y = -32 @@ -89637,7 +89635,7 @@ amA ano aog apg -aqk +svk aRz abN acy diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index d8d18c4407..638b1d7eae 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -15731,7 +15731,7 @@ /area/service/cafeteria/lunchroom) "aNb" = ( /obj/machinery/vending/sustenance{ - contraband = list(/obj/item/kitchen/knife = 6, /obj/item/reagent_containers/food/drinks/coffee = 12); + contraband = list(/obj/item/kitchen/knife=6,/obj/item/reagent_containers/food/drinks/coffee=12); desc = "A vending machine which vends food."; product_ads = "Sufficiently healthy." }, @@ -18176,11 +18176,14 @@ /turf/open/floor/plasteel, /area/cargo/office) "aTe" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plating, +/obj/machinery/mineral/ore_redemption{ + input_dir = 4; + output_dir = 8 + }, +/turf/open/floor/plasteel, /area/cargo/office) "aTf" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -19684,12 +19687,11 @@ /turf/open/floor/plasteel, /area/cargo/office) "aWv" = ( -/obj/machinery/door/firedoor, -/obj/machinery/mineral/ore_redemption{ - input_dir = 4; - output_dir = 8 +/obj/effect/turf_decal/tile/brown, +/obj/machinery/computer/piratepad_control/civilian{ + dir = 1 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/cargo/office) "aWw" = ( /obj/effect/turf_decal/tile/brown, @@ -21130,9 +21132,6 @@ /obj/machinery/status_display/supply{ pixel_x = -32 }, -/obj/machinery/computer/bounty{ - dir = 4 - }, /turf/open/floor/plasteel, /area/cargo/office) "aZk" = ( @@ -22996,9 +22995,6 @@ /turf/open/floor/plasteel, /area/cargo/qm) "bdH" = ( -/obj/machinery/computer/bounty{ - dir = 8 - }, /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -38786,7 +38782,7 @@ input_tag = "mix_in"; name = "Gas Mix Tank Control"; output_tag = "mix_in"; - sensors = list("mix_sensor" = "Tank") + sensors = list("mix_sensor"="Tank") }, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -40274,7 +40270,7 @@ input_tag = "n2o_in"; name = "Nitrous Oxide Supply Control"; output_tag = "n2o_out"; - sensors = list("n2o_sensor" = "Tank") + sensors = list("n2o_sensor"="Tank") }, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -41663,7 +41659,7 @@ input_tag = "tox_in"; name = "Plasma Supply Control"; output_tag = "tox_out"; - sensors = list("tox_sensor" = "Tank") + sensors = list("tox_sensor"="Tank") }, /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -59241,11 +59237,10 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "pHo" = ( -/obj/machinery/computer/bounty{ - dir = 1 - }, -/turf/open/floor/wood, -/area/command/heads_quarters/hop) +/obj/effect/turf_decal/tile/brown, +/obj/machinery/piratepad/civilian, +/turf/open/floor/plasteel, +/area/cargo/office) "pJy" = ( /obj/structure/rack, /obj/item/crowbar, @@ -97117,7 +97112,7 @@ aAG aBA aCQ aDS -pHo +aCS aAH aGu aHh @@ -101503,7 +101498,7 @@ aSe aTc aOT aVp -aWu +pHo aPW aYr aOV @@ -101760,7 +101755,7 @@ aSf aTd aUn aVr -aWu +aWv aLf aYs aZk @@ -102017,7 +102012,7 @@ lAs aTe aUo aVs -aWv +aLf aLf aPW aZl diff --git a/_maps/map_files/Snaxi/Snaxi.dmm b/_maps/map_files/Snaxi/Snaxi.dmm index 1e3c094cf6..ab251c7ecf 100644 --- a/_maps/map_files/Snaxi/Snaxi.dmm +++ b/_maps/map_files/Snaxi/Snaxi.dmm @@ -25706,7 +25706,6 @@ /obj/effect/turf_decal/tile/brown{ dir = 4 }, -/obj/machinery/computer/bounty, /turf/open/floor/plasteel, /area/cargo/storage) "jjB" = ( @@ -35734,7 +35733,7 @@ pixel_y = -22 }, /obj/machinery/light, -/obj/structure/closet/emcloset, +/obj/machinery/piratepad/civilian, /turf/open/floor/plasteel, /area/hallway/primary/fore) "pLP" = ( @@ -36866,7 +36865,7 @@ /area/engineering/secure_construction) "qzP" = ( /obj/machinery/vending/dinnerware{ - contraband = list(/obj/item/kitchen/rollingpin = 2, /obj/item/kitchen/knife/butcher = 2, /obj/item/reagent_containers/food/condiment/flour = 4) + contraband = list(/obj/item/kitchen/rollingpin=2,/obj/item/kitchen/knife/butcher=2,/obj/item/reagent_containers/food/condiment/flour=4) }, /turf/open/floor/plasteel/freezer, /area/service/kitchen) @@ -37112,7 +37111,9 @@ }, /area/service/chapel/main) "qHq" = ( -/obj/structure/closet/crate, +/obj/machinery/computer/piratepad_control/civilian{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hallway/primary/fore) "qHC" = ( @@ -44901,7 +44902,7 @@ dir = 8 }, /obj/effect/spawner/lootdrop/armory_contraband{ - loot = list(/obj/item/gun/ballistic/automatic/pistol = 5, /obj/item/gun/ballistic/shotgun/automatic/combat = 5, /obj/item/gun/ballistic/revolver/mateba, /obj/item/gun/ballistic/automatic/pistol/deagle, /obj/item/storage/box/syndie_kit/throwing_weapons = 3) + loot = list(/obj/item/gun/ballistic/automatic/pistol=5,/obj/item/gun/ballistic/shotgun/automatic/combat=5,/obj/item/gun/ballistic/revolver/mateba,/obj/item/gun/ballistic/automatic/pistol/deagle,/obj/item/storage/box/syndie_kit/throwing_weapons=3) }, /obj/effect/spawner/lootdrop/maintenance{ lootcount = 3; @@ -47804,16 +47805,6 @@ }, /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/ai_upload) -"xEf" = ( -/obj/machinery/computer/bounty{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown, -/turf/open/floor/plasteel, -/area/cargo/qm) "xEt" = ( /obj/structure/cable{ icon_state = "4-8" @@ -89686,7 +89677,7 @@ rDE dFF sLn acv -xEf +jmU krH avT xUL From c71dc547cd9d1fda4eda6bcf32ac8a779425b38b Mon Sep 17 00:00:00 2001 From: shellspeed1 Date: Sun, 18 Sep 2022 23:14:21 -0700 Subject: [PATCH 07/14] why do we have so many coin presses? --- _maps/RandomZLevels/away_mission/caves.dmm | 10 ++-------- _maps/RandomZLevels/away_mission/wildwest.dmm | 6 +----- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/_maps/RandomZLevels/away_mission/caves.dmm b/_maps/RandomZLevels/away_mission/caves.dmm index e33659fbdd..2195b9d0ec 100644 --- a/_maps/RandomZLevels/away_mission/caves.dmm +++ b/_maps/RandomZLevels/away_mission/caves.dmm @@ -1504,12 +1504,6 @@ }, /turf/open/floor/plasteel, /area/awaymission/caves/listeningpost) -"eQ" = ( -/obj/machinery/mineral/mint, -/turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14;TEMP=2.7" - }, -/area/awaymission/caves/BMP_asteroid) "eR" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plasteel, @@ -9345,8 +9339,8 @@ bM bM bL bL -eQ -eQ +bV +bV bV bV bV diff --git a/_maps/RandomZLevels/away_mission/wildwest.dmm b/_maps/RandomZLevels/away_mission/wildwest.dmm index 1fc7da1acd..6156c678dc 100644 --- a/_maps/RandomZLevels/away_mission/wildwest.dmm +++ b/_maps/RandomZLevels/away_mission/wildwest.dmm @@ -861,10 +861,6 @@ }, /turf/open/floor/carpet, /area/awaymission/wildwest/gov) -"di" = ( -/obj/machinery/mineral/mint, -/turf/open/floor/plating, -/area/awaymission/wildwest/refine) "dj" = ( /obj/effect/spawner/structure/window, /turf/open/floor/wood, @@ -33673,7 +33669,7 @@ bc bc bc bc -di +bc bc bh aW From 9759bd48e07664015c3281dd917d627f418162d9 Mon Sep 17 00:00:00 2001 From: shellspeed1 Date: Sun, 18 Sep 2022 23:19:33 -0700 Subject: [PATCH 08/14] another one --- _maps/RandomZLevels/away_mission/wildwest.dmm | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/_maps/RandomZLevels/away_mission/wildwest.dmm b/_maps/RandomZLevels/away_mission/wildwest.dmm index 6156c678dc..37999e77ab 100644 --- a/_maps/RandomZLevels/away_mission/wildwest.dmm +++ b/_maps/RandomZLevels/away_mission/wildwest.dmm @@ -1278,10 +1278,6 @@ icon_state = "ironsand4" }, /area/awaymission/wildwest/gov) -"eA" = ( -/obj/machinery/mineral/mint, -/turf/open/floor/plasteel, -/area/awaymission/wildwest/refine) "eC" = ( /obj/structure/chair/comfy/brown, /turf/open/floor/wood, @@ -29055,7 +29051,7 @@ aG aG aG et -eA +eu eu eu eu From c7a44a96901a142af6d2580dd7b28f7694b46004 Mon Sep 17 00:00:00 2001 From: shellspeed1 Date: Sun, 18 Sep 2022 23:26:02 -0700 Subject: [PATCH 09/14] even more maps. --- .../map_files/SpookyStation/SpookyStation.dmm | 20 ++----------------- _maps/map_files/debug/runtimestation.dmm | 3 --- 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/_maps/map_files/SpookyStation/SpookyStation.dmm b/_maps/map_files/SpookyStation/SpookyStation.dmm index b40f7adaab..c8fdb504b4 100644 --- a/_maps/map_files/SpookyStation/SpookyStation.dmm +++ b/_maps/map_files/SpookyStation/SpookyStation.dmm @@ -3720,10 +3720,6 @@ }, /turf/open/floor/wood, /area/eventmap/inside) -"alc" = ( -/obj/machinery/computer/bounty, -/turf/open/floor/wood, -/area/eventmap/inside) "ald" = ( /obj/machinery/computer/cargo/request, /turf/open/floor/wood, @@ -12424,9 +12420,6 @@ /turf/open/floor/plasteel, /area/eventmap/mountaininside) "aJT" = ( -/obj/machinery/computer/bounty{ - dir = 8 - }, /obj/structure/cable/white{ icon_state = "1-2" }, @@ -14199,15 +14192,6 @@ }, /turf/open/floor/wood/damturf/broken3, /area/eventmap/inside) -"aOT" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/computer/bounty{ - dir = 1 - }, -/turf/open/floor/wood, -/area/eventmap/inside) "aOU" = ( /obj/structure/cable/white{ icon_state = "4-8" @@ -18162,7 +18146,7 @@ aqr aqr aOG aOM -aOT +aBm aqr aac aac @@ -38454,7 +38438,7 @@ adR aDI aiZ akz -alc +aOE aOo aHT aqa diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 3dff7a8f44..569dc9736d 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -1913,9 +1913,6 @@ /obj/machinery/camera/autoname{ dir = 4 }, -/obj/machinery/computer/bounty{ - dir = 4 - }, /turf/open/floor/plasteel, /area/cargo/storage) "fr" = ( From e3a3462b857a07962659c058007dd444e8f5f5e9 Mon Sep 17 00:00:00 2001 From: shellspeed1 Date: Tue, 20 Sep 2022 13:37:14 -0700 Subject: [PATCH 10/14] bounty bugfix --- code/game/machinery/civilian_bountys.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/civilian_bountys.dm b/code/game/machinery/civilian_bountys.dm index e983afeed1..5bcf0a8c76 100644 --- a/code/game/machinery/civilian_bountys.dm +++ b/code/game/machinery/civilian_bountys.dm @@ -109,7 +109,7 @@ if(!inserted_scan_id || !inserted_scan_id.registered_account) return var/datum/bank_account/pot_acc = inserted_scan_id.registered_account - if(pot_acc.civilian_bounty && ((world.time) < pot_acc.bounty_timer + 5 MINUTES)) + if((pot_acc.civilian_bounty && ((world.time) < pot_acc.bounty_timer + 5 MINUTES)) || pot_acc.bounties) var/curr_time = round(((pot_acc.bounty_timer + (5 MINUTES))-world.time)/ (1 MINUTES), 0.01) to_chat(usr, "Internal ID network spools coiling, try again in [curr_time] minutes!") return FALSE @@ -123,7 +123,7 @@ pot_acc.bounties = crumbs /obj/machinery/computer/piratepad_control/civilian/proc/pick_bounty(choice) - if(inserted_scan_id?.registered_account) + if(!inserted_scan_id?.registered_account) playsound(loc, 'sound/machines/synth_no.ogg', 40 , TRUE) return inserted_scan_id.registered_account.civilian_bounty = inserted_scan_id.registered_account.bounties[choice] From 44536ad7ab378eb3f388b24bd4a0b37d4ad63aa5 Mon Sep 17 00:00:00 2001 From: shellspeed1 Date: Tue, 20 Sep 2022 16:57:49 -0700 Subject: [PATCH 11/14] Fixes a runtime which bricked the pad plus fixing sprites. Also ports https://github.com/tgstation/tgstation/pull/55533 credit to cacogen. --- code/game/machinery/civilian_bountys.dm | 20 +++++++++++++++----- code/modules/events/pirates.dm | 15 +++++++++------ icons/obj/telescience.dmi | Bin 13951 -> 6094 bytes 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/code/game/machinery/civilian_bountys.dm b/code/game/machinery/civilian_bountys.dm index 5bcf0a8c76..9c913ee9cf 100644 --- a/code/game/machinery/civilian_bountys.dm +++ b/code/game/machinery/civilian_bountys.dm @@ -1,3 +1,5 @@ +#define CIV_BOUNTY_SPLIT 30 + ///Pad for the Civilian Bounty Control. /obj/machinery/piratepad/civilian name = "civilian bounty pad" @@ -97,7 +99,11 @@ SSeconomy.civ_bounty_tracker++ var/obj/item/bounty_cube/reward = new /obj/item/bounty_cube(drop_location()) reward.bounty_value = curr_bounty.reward - reward.AddComponent(/datum/component/pricetag, inserted_scan_id.registered_account, 10) + reward.bounty_name = curr_bounty.name + reward.bounty_holder = inserted_scan_id.registered_name + reward.name = "\improper [reward.bounty_value] cr [reward.name]" + reward.desc += " The tag indicates it was [reward.bounty_holder]'s reward for completing the [reward.bounty_name] bounty and that it was created at [station_time_timestamp(format = "hh:mm")]." + reward.AddComponent(/datum/component/pricetag, inserted_scan_id.registered_account, CIV_BOUNTY_SPLIT) pad.visible_message("[pad] activates!") flick(pad.sending_state,pad) pad.icon_state = pad.idle_state @@ -151,15 +157,15 @@ if(inserted_scan_id.registered_account.civilian_bounty) data["id_bounty_info"] = inserted_scan_id.registered_account.civilian_bounty.description data["id_bounty_num"] = inserted_scan_id.registered_account.bounty_num() - data["id_bounty_value"] = inserted_scan_id.registered_account.civilian_bounty.reward + data["id_bounty_value"] = (inserted_scan_id.registered_account.civilian_bounty.reward) * (CIV_BOUNTY_SPLIT/100) if(inserted_scan_id.registered_account.bounties) data["picking"] = TRUE data["id_bounty_names"] = list(inserted_scan_id.registered_account.bounties[1].name, inserted_scan_id.registered_account.bounties[2].name, inserted_scan_id.registered_account.bounties[3].name) - data["id_bounty_values"] = list(inserted_scan_id.registered_account.bounties[1].reward, - inserted_scan_id.registered_account.bounties[2].reward, - inserted_scan_id.registered_account.bounties[3].reward) + data["id_bounty_values"] = list(inserted_scan_id.registered_account.bounties[1].reward * (CIV_BOUNTY_SPLIT/100), + inserted_scan_id.registered_account.bounties[2].reward * (CIV_BOUNTY_SPLIT/100), + inserted_scan_id.registered_account.bounties[3].reward * (CIV_BOUNTY_SPLIT/100)) else data["picking"] = FALSE return data @@ -235,6 +241,10 @@ icon_state = "bounty_cube" ///Value of the bounty that this bounty cube sells for. var/bounty_value = 0 + ///Who completed the bounty. + var/bounty_holder + ///What the bounty was for. + var/bounty_name ///Beacon to launch a new bounty setup when activated. diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index 749c2e4f3e..188d733cd8 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -251,8 +251,8 @@ /obj/machinery/piratepad name = "cargo hold pad" icon = 'icons/obj/telescience.dmi' - icon_state = "lpad-idle-o" - var/idle_state = "lpad-idle-o" + icon_state = "lpad-idle-off" + var/idle_state = "lpad-idle" var/warmup_state = "lpad-idle" var/sending_state = "lpad-beam" var/cargo_hold_id @@ -296,7 +296,7 @@ . = ..() if (istype(I) && istype(I.buffer,/obj/machinery/piratepad)) to_chat(user, "You link [src] with [I.buffer] in [I] buffer.") - pad = I.buffer + pad_ref = WEAKREF(I.buffer) return TRUE /obj/machinery/computer/piratepad_control/LateInitialize() @@ -304,10 +304,11 @@ if(cargo_hold_id) for(var/obj/machinery/piratepad/P in GLOB.machines) if(P.cargo_hold_id == cargo_hold_id) - pad = P + pad_ref = WEAKREF(P) return else pad = locate() in range(4,src) + pad_ref = WEAKREF(pad) /obj/machinery/computer/piratepad_control/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -318,7 +319,7 @@ /obj/machinery/computer/piratepad_control/ui_data(mob/user) var/list/data = list() data["points"] = points - data["pad"] = pad ? TRUE : FALSE + data["pad"] = pad_ref?.resolve() ? TRUE : FALSE data["sending"] = sending data["status_report"] = status_report return data @@ -327,7 +328,7 @@ . = ..() if(.) return - if(!pad) + if(!pad_ref?.resolve()) return switch(action) @@ -348,6 +349,7 @@ status_report = "Predicted value: " var/value = 0 var/datum/export_report/ex = new + var/obj/machinery/piratepad/pad = pad_ref?.resolve() for(var/atom/movable/AM in get_turf(pad)) if(AM == pad) continue @@ -366,6 +368,7 @@ return var/datum/export_report/ex = new + var/obj/machinery/piratepad/pad = pad_ref?.resolve() for(var/atom/movable/AM in get_turf(pad)) if(AM == pad) diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi index 1e60c01131fe33885f65d1918eadc3efef606f63..b342d2db71b27bb80ec6a1bd5ede88ebd7e62dc6 100644 GIT binary patch literal 6094 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 PWuV9E&($hbti%2n3!Q#I From a55b2c4ff3ebfd22e8ed6d56966199d774743975 Mon Sep 17 00:00:00 2001 From: shellspeed1 Date: Tue, 20 Sep 2022 20:05:59 -0700 Subject: [PATCH 12/14] ports https://github.com/tgstation/tgstation/pull/56375. Credit to cacogen. --- code/datums/components/pricetag.dm | 23 +++-- code/game/machinery/civilian_bountys.dm | 93 +++++++++++++++++-- code/modules/cargo/export_scanner.dm | 23 ++++- code/modules/cargo/exports/civilain_bounty.dm | 2 +- .../mob/living/carbon/human/human_helpers.dm | 11 ++- 5 files changed, 132 insertions(+), 20 deletions(-) diff --git a/code/datums/components/pricetag.dm b/code/datums/components/pricetag.dm index 3220dc425a..2ad63c6464 100644 --- a/code/datums/components/pricetag.dm +++ b/code/datums/components/pricetag.dm @@ -1,13 +1,17 @@ /datum/component/pricetag - var/datum/bank_account/owner - var/profit_ratio = 1 + ///Payee gets 100% of the value if no ratio has been set. + var/default_profit_ratio = 1 + ///List of bank accounts this pricetag pays out to. Format is payees[bank_account] = profit_ratio. + var/list/payees = list() + /datum/component/pricetag/Initialize(_owner,_profit_ratio) if(!isobj(parent)) //Has to account for both objects and sellable structures like crates. return COMPONENT_INCOMPATIBLE - owner = _owner if(_profit_ratio) - profit_ratio = _profit_ratio + payees[_owner] = _profit_ratio + else + payees[_owner] = default_profit_ratio RegisterSignal(parent, COMSIG_ITEM_SOLD, .proc/split_profit) RegisterSignal(parent, COMSIG_STRUCTURE_UNWRAPPED, .proc/Unwrapped) RegisterSignal(parent, COMSIG_ITEM_UNWRAPPED, .proc/Unwrapped) @@ -19,10 +23,13 @@ /datum/component/pricetag/proc/split_profit(var/item_value) var/price = item_value if(price) - var/adjusted_value = price*(profit_ratio/100) - owner.adjust_money(adjusted_value) - owner.bank_card_talk("Sale recorded. [adjusted_value] credits added to account.") + for(var/datum/bank_account/payee in payees) + var/profit_ratio = payees[payee] + var/adjusted_value = price * profit_ratio + var/datum/bank_account/bank_account = payee + bank_account.adjust_money(adjusted_value) + bank_account.bank_card_talk("Sale of [parent] recorded. [adjusted_value] credits added to account.") return TRUE /datum/component/pricetag/proc/return_ratio() - return profit_ratio + return default_profit_ratio diff --git a/code/game/machinery/civilian_bountys.dm b/code/game/machinery/civilian_bountys.dm index 9c913ee9cf..36ce96ea7e 100644 --- a/code/game/machinery/civilian_bountys.dm +++ b/code/game/machinery/civilian_bountys.dm @@ -98,12 +98,7 @@ inserted_scan_id.registered_account.reset_bounty() SSeconomy.civ_bounty_tracker++ var/obj/item/bounty_cube/reward = new /obj/item/bounty_cube(drop_location()) - reward.bounty_value = curr_bounty.reward - reward.bounty_name = curr_bounty.name - reward.bounty_holder = inserted_scan_id.registered_name - reward.name = "\improper [reward.bounty_value] cr [reward.name]" - reward.desc += " The tag indicates it was [reward.bounty_holder]'s reward for completing the [reward.bounty_name] bounty and that it was created at [station_time_timestamp(format = "hh:mm")]." - reward.AddComponent(/datum/component/pricetag, inserted_scan_id.registered_account, CIV_BOUNTY_SPLIT) + reward.set_up(curr_bounty, inserted_scan_id) pad.visible_message("[pad] activates!") flick(pad.sending_state,pad) pad.icon_state = pad.idle_state @@ -245,6 +240,92 @@ var/bounty_holder ///What the bounty was for. var/bounty_name + ///Multiplier for the bounty payout received by the Supply budget if the cube is sent without having to nag. + var/speed_bonus = 0.2 + ///Multiplier for the bounty payout received by the person who completed the bounty. + var/holder_cut = 0.3 + ///Multiplier for the bounty payout received by the person who claims the handling tip. + var/handler_tip = 0.1 + ///Time between nags. + var/nag_cooldown = 5 MINUTES + ///How much the time between nags extends each nag. + var/nag_cooldown_multiplier = 1.25 + ///Next world tick to nag Supply listeners. + var/next_nag_time + ///What job the bounty holder had. + var/bounty_holder_job + ///Bank account of the person who receives the handling tip. + var/datum/bank_account/bounty_handler_account + ///Bank account of the person who completed the bounty. + var/datum/bank_account/bounty_holder_account + ///Our internal radio. + var/obj/item/radio/radio + ///The key our internal radio uses. + var/radio_key = /obj/item/encryptionkey/headset_cargo + +/obj/item/bounty_cube/Initialize() + . = ..() + radio = new(src) + radio.keyslot = new radio_key + radio.listening = FALSE + radio.recalculateChannels() + +/obj/item/bounty_cube/Destroy() + QDEL_NULL(radio) + . = ..() + +/obj/item/bounty_cube/examine() + . = ..() + if(speed_bonus) + . += "[time2text(next_nag_time - world.time,"mm:ss")] remains until [bounty_value * speed_bonus] credit speedy delivery bonus lost." + if(handler_tip && !bounty_handler_account) + . += "Scan this in the cargo shuttle with an export scanner to register your bank account for the [bounty_value * handler_tip] credit handling tip." + +/obj/item/bounty_cube/process(delta_time) + if(COOLDOWN_FINISHED(src, next_nag_time)) + if(!is_centcom_level(z) && !is_reserved_level(z)) //don't send message if we're on Centcom or in transit + radio.talk_into(src, "Unsent in [get_area(src)].[speed_bonus ? " Speedy delivery bonus of [bounty_value * speed_bonus] credit\s lost." : ""]", RADIO_CHANNEL_SUPPLY) + speed_bonus = 0 + bounty_holder_account.bank_card_talk("\The [src] is unsent in [get_area(src)].") + if(bounty_handler_account) + bounty_handler_account.bank_card_talk("\The [src] is unsent in [get_area(src)].") + nag_cooldown = nag_cooldown * nag_cooldown_multiplier + COOLDOWN_START(src, next_nag_time, nag_cooldown) + +/obj/item/bounty_cube/proc/set_up(datum/bounty/my_bounty, obj/item/card/id/holder_id) + bounty_value = my_bounty.reward + bounty_name = my_bounty.name + bounty_holder = holder_id.registered_name + bounty_holder_job = holder_id.assignment + bounty_holder_account = holder_id.registered_account + name = "\improper [bounty_value] cr [name]" + desc += " The sales tag indicates it was [bounty_holder] ([bounty_holder_job])'s reward for completing the [bounty_name] bounty." + AddComponent(/datum/component/pricetag, holder_id.registered_account, holder_cut) + START_PROCESSING(SSobj, src) + COOLDOWN_START(src, next_nag_time, nag_cooldown) + radio.talk_into(src,"Created in [get_area(src)] by [bounty_holder] ([bounty_holder_job]). Speedy delivery bonus lost in [time2text(next_nag_time - world.time,"mm:ss")].", RADIO_CHANNEL_SUPPLY) + +//for when you need a REAL bounty cube to test with and don't want to do a bounty each time your code changes +/obj/item/bounty_cube/test_cube + name = "debug bounty cube" + desc = "Use in-hand to set it up with a random bounty. Requires an ID it can detect with a bank account attached. \ + This will alert Supply over the radio with your name and location, and cargo techs will be dispatched to your location with kill on sight clearance." + var/set_up = FALSE + +/obj/item/bounty_cube/test_cube/attack_self(mob/user) + if(!isliving(user)) + to_chat(user, "You aren't eligible to use this!") + return ..() + + if(!set_up) + var/mob/living/squeezer = user + if(squeezer.get_bank_account()) + set_up(random_bounty(), squeezer.get_idcard()) + set_up = TRUE + return ..() + to_chat(user, "It can't detect your bank account.") + + return ..() ///Beacon to launch a new bounty setup when activated. diff --git a/code/modules/cargo/export_scanner.dm b/code/modules/cargo/export_scanner.dm index 80fd05cf8c..dcb476c459 100644 --- a/code/modules/cargo/export_scanner.dm +++ b/code/modules/cargo/export_scanner.dm @@ -43,5 +43,24 @@ to_chat(user, "Scanned [O], value: [price] credits[O.contents.len ? " (contents included)" : ""].") else to_chat(user, "Scanned [O], no export value.") - if(bounty_ship_item_and_contents(O, dry_run=TRUE)) - to_chat(user, "Scanned item is eligible for one or more bounties.") + + + if(ishuman(user)) + var/mob/living/carbon/human/scan_human = user + if(istype(O, /obj/item/bounty_cube)) + var/obj/item/bounty_cube/cube = O + + if(!istype(get_area(cube), /area/shuttle/supply)) + to_chat(user, "Shuttle placement not detected. Handling tip not registered.") + + else if(cube.bounty_handler_account) + to_chat(user, "Bank account for handling tip already registered!") + + else if(scan_human.get_bank_account() && cube.GetComponent(/datum/component/pricetag)) + var/datum/component/pricetag/pricetag = cube.GetComponent(/datum/component/pricetag) + cube.bounty_handler_account = scan_human.get_bank_account() + pricetag.payees[cube.bounty_handler_account] += cube.handler_tip + cube.bounty_handler_account.bank_card_talk("Bank account for [price ? "[price * cube.handler_tip] credit " : ""]handling tip successfully registered.") + cube.bounty_holder_account.bank_card_talk("[cube] was scanned in \the [get_area(cube)] by [scan_human] ([scan_human.job]).") + else + to_chat(user, "Bank account not detected. Handling tip not registered.") diff --git a/code/modules/cargo/exports/civilain_bounty.dm b/code/modules/cargo/exports/civilain_bounty.dm index 3d443fbad0..58486f176b 100644 --- a/code/modules/cargo/exports/civilain_bounty.dm +++ b/code/modules/cargo/exports/civilain_bounty.dm @@ -5,4 +5,4 @@ export_types = list(/obj/item/bounty_cube) /datum/export/bounty_box/get_cost(obj/item/bounty_cube/cube, allowed_categories, apply_elastic) - return cube.bounty_value + return cube.bounty_value + (cube.bounty_value * (cube.speed_bonus / 100)) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index a3c6294aec..470eb626ae 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -123,16 +123,21 @@ to_chat(src, span_warning("You can't bring yourself to use a ranged weapon!")) return FALSE -/mob/living/carbon/human/proc/get_bank_account() +//Returns the bank account of an ID the user may be holding. +/mob/living/proc/get_bank_account() RETURN_TYPE(/datum/bank_account) var/datum/bank_account/account var/obj/item/card/id/I = get_idcard() - if(I && I.registered_account) + if(I?.registered_account) account = I.registered_account return account - return FALSE +/mob/living/proc/toggle_resting() + set name = "Rest" + set category = "IC" + + set_resting(!resting, FALSE) /mob/living/carbon/human/can_see_reagents() . = ..() From de4d468472f9d541c8aa5872c878102a2198d951 Mon Sep 17 00:00:00 2001 From: shellspeed1 Date: Tue, 20 Sep 2022 20:55:38 -0700 Subject: [PATCH 13/14] lets not have bounty cubes worth a bunch more than they should be. port of https://github.com/tgstation/tgstation/pull/56914 Credit to cacogen. --- code/game/machinery/civilian_bountys.dm | 6 ++-- code/modules/recycling/sortingmachinery.dm | 36 +++++++++++++--------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/code/game/machinery/civilian_bountys.dm b/code/game/machinery/civilian_bountys.dm index 36ce96ea7e..0395956d8b 100644 --- a/code/game/machinery/civilian_bountys.dm +++ b/code/game/machinery/civilian_bountys.dm @@ -94,12 +94,14 @@ stop_sending() if(curr_bounty.can_claim()) //Pay for the bounty with the ID's department funds. - status_report += "Bounty Completed! Please send your completed bounty cube to cargo for your automated payout shortly." + status_report += "Bounty completed! Please give your bounty cube to cargo for your automated payout shortly." inserted_scan_id.registered_account.reset_bounty() SSeconomy.civ_bounty_tracker++ + var/obj/item/bounty_cube/reward = new /obj/item/bounty_cube(drop_location()) reward.set_up(curr_bounty, inserted_scan_id) - pad.visible_message("[pad] activates!") + + pad.visible_message(span_notice("[pad] activates!")) flick(pad.sending_state,pad) pad.icon_state = pad.idle_state playsound(loc, 'sound/machines/synth_yes.ogg', 30 , TRUE) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 28176e5ed4..97a35f9312 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -79,11 +79,11 @@ tagger.paper_count -= 1 sticker = new /obj/item/barcode(src) sticker.payments_acc = tagger.payments_acc //new tag gets the tagger's current account. - sticker.percent_cut = tagger.percent_cut //same, but for the percentage taken. + sticker.cut_multiplier = tagger.cut_multiplier //same, but for the percentage taken. var/list/wrap_contents = src.GetAllContents() for(var/obj/I in wrap_contents) - I.AddComponent(/datum/component/pricetag, sticker.payments_acc, tagger.percent_cut) + I.AddComponent(/datum/component/pricetag, sticker.payments_acc, tagger.cut_multiplier) var/overlaystring = "[icon_state]_tag" if(giftwrapped) overlaystring = copytext(overlaystring, 5) @@ -222,11 +222,11 @@ tagger.paper_count -= 1 sticker = new /obj/item/barcode(src) sticker.payments_acc = tagger.payments_acc //new tag gets the tagger's current account. - sticker.percent_cut = tagger.percent_cut //as above, as before. + sticker.cut_multiplier = tagger.cut_multiplier //as above, as before. var/list/wrap_contents = src.GetAllContents() for(var/obj/I in wrap_contents) - I.AddComponent(/datum/component/pricetag, sticker.payments_acc, tagger.percent_cut) + I.AddComponent(/datum/component/pricetag, sticker.payments_acc, tagger.cut_multiplier) var/overlaystring = "[icon_state]_tag" if(giftwrapped) overlaystring = copytext(overlaystring, 5) @@ -317,7 +317,7 @@ /obj/item/sales_tagger name = "sales tagger" - desc = "A scanner that lets you tag wrapped items for sale, splitting the profit between you and cargo. Ctrl-Click to clear the registered account." + desc = "A scanner that lets you tag wrapped items for sale, splitting the profit between you and cargo." icon = 'icons/obj/device.dmi' icon_state = "salestagger" item_state = "electronic" @@ -330,12 +330,19 @@ var/paper_count = 10 var/max_paper_count = 20 ///Details the percentage the scanned account recieves off the final sale. - var/percent_cut = 20 + ///The person who tagged this will receive the sale value multiplied by this number. + var/cut_multiplier = 0.5 + ///Maximum value for cut_multiplier. + var/cut_max = 0.5 + ///Minimum value for cut_multiplier. + var/cut_min = 0.01 /obj/item/sales_tagger/examine(mob/user) . = ..() - . += "[src] has [paper_count]/[max_paper_count] available barcodes. Refill with paper." - . += "Profit split on sale is currently set to [percent_cut]%." + . += "[src] has [paper_count]/[max_paper_count] available barcodes. Refill with paper." + . += "Profit split on sale is currently set to [round(cut_multiplier*100)]%. Alt-click to change." + if(payments_acc) + . += "Ctrl-click to clear the registered account." /obj/item/sales_tagger/attackby(obj/item/I, mob/living/user, params) . = ..() @@ -376,7 +383,8 @@ playsound(src, 'sound/machines/click.ogg', 40, TRUE) to_chat(user, "You print a new barcode.") var/obj/item/barcode/new_barcode = new /obj/item/barcode(src) - new_barcode.payments_acc = payments_acc //The sticker gets the scanner's registered account. + new_barcode.payments_acc = payments_acc // The sticker gets the scanner's registered account. + new_barcode.cut_multiplier = cut_multiplier // Also the registered percent cut. user.put_in_hands(new_barcode) /obj/item/sales_tagger/CtrlClick(mob/user) @@ -386,11 +394,11 @@ /obj/item/sales_tagger/AltClick(mob/user) . = ..() - var/potential_cut = input("How much would you like to payout to the registered card?","Percentage Profit") as num|null + var/potential_cut = input("How much would you like to pay out to the registered card?","Percentage Profit ([round(cut_min*100)]% - [round(cut_max*100)]%)") as num|null if(!potential_cut) - percent_cut = 50 - percent_cut = clamp(round(potential_cut, 1), 1, 50) - to_chat(user, "[percent_cut]% profit will be recieved if a package with a barcode is sold.") + cut_multiplier = initial(cut_multiplier) + cut_multiplier = clamp(round(potential_cut/100, cut_min), cut_min, cut_max) + to_chat(user, "[round(cut_multiplier*100)]% profit will be received if a package with a barcode is sold.") /obj/item/barcode name = "Barcode tag" @@ -400,4 +408,4 @@ w_class = WEIGHT_CLASS_TINY ///All values inheirited from the sales tagger it came from. var/datum/bank_account/payments_acc = null - var/percent_cut = 5 + var/cut_multiplier = 0.5 From 5fc34292c0865fa1853567283622b71e0082bd3c Mon Sep 17 00:00:00 2001 From: shellspeed1 Date: Sun, 9 Oct 2022 15:45:51 -0700 Subject: [PATCH 14/14] fixes resting --- code/modules/mob/living/carbon/human/human_helpers.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 470eb626ae..2c58da29c9 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -133,12 +133,6 @@ account = I.registered_account return account -/mob/living/proc/toggle_resting() - set name = "Rest" - set category = "IC" - - set_resting(!resting, FALSE) - /mob/living/carbon/human/can_see_reagents() . = ..() if(.) //No need to run through all of this if it's already true.