From fbbddbb0122f655232165b6ab5e237ea8d178eca Mon Sep 17 00:00:00 2001 From: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com> Date: Sat, 5 Apr 2025 10:53:02 -0400 Subject: [PATCH] Revises and adds several new bounties for assistants, roboticists, and medical doctors. (#89772) ## About The Pull Request This pull request makes several balance adjustments to older bounties, primarily for the roboticist and assistant. Additionally, this adds a new type of medical doctor bounty as well. ### Bounty Modifications: **Assistant**: Toolbox bounty The toolbox bounty now requests 1 toolbox instead of 6. However, the toolbox bounty now requires a fully packed mechanical toolbox worth of contents. That means any toolbox, containing a screwdriver, wrench, welding tool, crowbar, analyzer, and wire cutters. When shipped, non-toolbox contents are dropped. Why It's Good For The Game (**WIGFTG**): This bounty follows bad design principles, being a bounty that can be solved entirely from a lathe. For any of these cases, we want to either replace them or recontexualize them into an activity that forces players to either learn more about the mechanics in and around that area as a form of played tutorial, give them a toe-dip into the mechanics required to complete the activity, or perform an activity that makes the station better for having completed it. For the toolbox bounty, this goes all in on teaching players about the full set of toolbox equipment, instead of just needing one printable item, it takes them through the full autolathe menu and gives them plausible deniability for getting a full set of tools. **Assistant:** Potted Plants. The potted plant bounty now requires 3 potted plants as opposed to 8. Most stations are going to be completely devoid of potted plants after collecting 8 of these, where lowering the quantity to 3 allows for a larger amount of competition for this type of bounty. This also disallows using plastic potted plants from being used in the bounty as a trade off, as real potted plants are available through other means. **WIGFTG**: Removes a lathe-solved bounty, and adjusts the quantity to compensate for the fact that previously you would loot the entire station of all of it's potted plants in order to complete this bounty one time. **Assistant:** Action Figures -> Toys Action figures and their general availability widely varies by maps. At best, you can snag one per office on (I think) delta, and at worse you'll need to fish them out of arcade machines across the station. Considering how often new toys are added to the vending machine, this can be a very raw deal where you might be spending 10s of minutes just for maybe one or two action figures. Instead, it feels like a wider and better solution is to just make this touch the whole toys category. WIGFTG: For the toys bounty, it's far too scarce to complete regularly, but instead now it gives makes players interact with the arcade machine wholistically, which in turn requires players to have to play an arcade machine just enough that they're likely to gains a level in the gamer skill, and serve as a primer to interact with how skills interact with the round at large. Granted, it's the gamer skill, so it's not the end of the world if players are getting skill increases here as opposed to other skills that may have more of an effect on the round at large. **Assistant:** Pens. Fuck this bounty. I have removed it. **WIGFTG**: Allow me to elaborate. So the pens bounty requires 10 pens. However, it requires specifically `/obj/item/pen`, no subtypes. `/obj/item/pen` is not printable. It is not found at quantities that make it easy to specifically complete. You cannot use red pens. Or fountain pens. Or blue pens. Or Crayons. Just standard black pens that spawn in your PDA and on paper bins. And you need 10. There is **A** printable pen, however, `/obj/item/pen/red/security`, which is however printable from autolathes, leading many players and myself to think that this is another easy printable bounty. But EVEN THEN, even if those pens WERE ACCEPTABLE, having to manually carry 10 tiny objects to complete a bounty worth not even 200 credits to the bounty holder? This just sucks. It's Bleem. Get it outta here. **Robotics**: All current mech bounties (MK 2 Ripley, Clarke, Odysseus, Gygax, and Durand) Robotics bounties have been reworked. Now, mecha bounties require that a new mecha of that type be built, and that a holodiagnostic scan be completed of the mech. This can be done once-per mech, which will print out a holodiagnostic sheet onto the floor. This sheet is what is turned in for the bounty. As a result, the value of these bounties have been roughly halved. For those looking to collect the rest of the previous value, all 5 of these mechs can now be sold on the cargo shuttle for the remaining value of the old bounties. **WIGFTG**: The biggest hurdle for roboticists when it comes to economy is twofold: Roboticist need resources far more than most other jobs in the game. No metal means no cyborgs, or mechs, or cool equipment for robotics. But, if a roboticist needs credits, they have to trade away a new mech in exchange for some of the largest credit pool bounties in the game. If they can't spend those credits, or can't receive anything using those credits, that's effort wasted. There's a tremendous amount of uncertainty when it comes to robotics being able to meaningfully interact with the credit economy as it currently stands, or being able to leverage the credit economy to solve any of their issues. If the player really does just want to sell their mech for credits, this also provides them with a method of doing so that will still reward them even further if they feel they truly do not need it. Side note, the cargo loader mech "old bess" has the trait provided by generating a diagnostic already, preventing them from just scanning that for an easy minute 1 bounty. Ultimately, having to sell a mech for credits as opposed to getting to use it is not *fun*. Getting to get paid for doing your job, and getting the benefits of something you'll have spend a reasonable amount of time and the station's resources on is *fun*. It's a better pay off. It's why we're here. ![image](https://github.com/user-attachments/assets/d372a338-14dc-49a3-8279-4cb379c13c10) **Medical:** Crew Scan Bounties. Medical staff are now given the chance to perform routine medical scan bounties. These require a medical doctor to scan another crew member who is above 90% health, and then print the reports to submit. Some stipulations: * The report cannot be of the bounty holder. * A scanned crewmate must be scanned above 90% heath. * When the report is printed, the target is given a trait for 5 minutes, `TRAIT_RECENTLY_TREATED`, which disqualifies them being the target of a submitted medical report. This is to encourage the doctor to check up on several members of the crew when submitting this bounty. **WIGFTG**: Medical bounties are in an awkward place, honestly. They are possible to become purely printable bounties using either advanced organs, or through the organ grower. However, both of these outcomes are research locked, and will require a more through look down the line, don't get me wrong. In the meantime, this falls squarely under that area of "getting medical doctor bounties to be more closely aligned with doing what they're already supposed to be doing". I also floated the idea of making medical bounties pick a random crewmate for a check-up as opposed to a few different members of the crew from anyone. I might follow up on that at a later date, but this PR was already getting a bit overloaded. ![image](https://github.com/user-attachments/assets/63ab2a4f-1eab-410b-9b37-c9299199191b) ### Some other things tacked on here: I swear I'll be fast. The `/obj/item/paper/medical_report` created is a new subtype of paper as opposed to the old type that was used by health analyzers, which holds the last scanned mob as a weakref as opposed to just creating a snowflaked paper as we were doing before. The bounty pad, when it generates it's list of bounties, now works slightly differently so that there's no chance of getting a list of three "random" bounties that are all exactly the same thing, called in a new proc, `generate_bounty_list()`. I've added a new debug item, called the `/obj/item/bounty_voucher`. This item allows you to use it in-hand and it gives the activating player a new bounty from a list of all possible bounties. This makes my life, just specifically just me and nobody else, easier when testing bounties. As mentioned above, the mecha UI required adding a new button to it in order to create holoscans. It's fairly innocuous if I do say so myself, but I can make further tweaks if it's an issue. ## Why It's Good For The Game I've sprinkled a good bit of this in above, but in general, bounties needed some more TLC to make sure they align with their place as a tertiary source of making money in the game. I've talked about this before in some now-ancient design documents, but in summary, there's three forms of credit sources in the game: * Primary sources: This is regular payroll, earned by playing the game when the economy SS fires. In theory, this is how much money you can spend without needing to think about making a purchase most of the time. * Secondary sources: This is from sources like tourist bots. Ignore the design decisions they inhabit, they're gameplay loops that allow you to make additional credits while still performing the functions of your job for the station, which in tourist bot's case, is making food and drinks and serving people, making up for any costs incurred by their presence. * Tertiary sources: This is bounties. These are activities that exist as a fallback from the secondary sources, where you may not be performing the duties of your job in order to get credits, should they be more critical as a resource than the service you provide to the station as a result. ...Everyone has been fairly clear that doing bounties is not very good. If you're playing medical doctor and want a shiny medical doctor thing, you would hope that the majority of your time is spent still playing medical doctor, or scientist, or whatever. However, of all the jobs that have fairly sub-par bounties, the one job that I've heard time and again that I actually got *right* was surprisingly, security officer. Their sets of bounties, (Which aren't just looting the locker room mind you...) between the contraband bounty and the n-spect scanner bounties, actually encourages players to basically do tasks that are already part of their job obligations, without needing to run to the nearest lathe or to _steal 8 boar tusks that drop from the barrens_. The bounties are basically, "Go on patrol to this area", "look for suspicious items on the station", etc. In effect, those are *secondary credit sources*. Which is fantastic! It gave me the idea to revisit a few of these job bounties to try and make them a bit less exhausting to have to deal with, and as usual I got a bit distracted and the scope got a bit too big and now it's march. God damnit. But yeah if this goes well, I'd love to see about adjust a few of the bounty methodologies to be in-line with the changes I've implemented here. More bounties that encourage players to be doing what they're already doing, bounties that encourage players to learn more about the game when it comes to assistant bounties or that encourage them to get a toe-dip report on mechanics that they may not be introduced to yet, and get rid of some of the CBT bounties that nobody in their god damn mind wants to do. ## Changelog :cl: add: New Medical bounty! Scan crewmates who have been healed or currently have a clean bill of health, and ship the medical report to prove that you're not accidently letting them die on your watch. Most of the time. balance: Assistant bounties for toolboxes now only require 1, but the toolbox must be fully stocked like standard mechanical toolboxes. balance: Potted plant bounties no longer accept plastic plants. They only require 3 plants now, however. balance: The action figure bounty now only requires toys instead. del: Removed the pens bounty. balance: The robotics mech bounty now requires a diagnostic scan of a newly completed mech as opposed to sending the whole mech itself. Diagnostic scans can now be generated by riding in a mech and completing the action from the UI menu. Mech bounties are worth about half as much. add: Mechs can be sold on the cargo shuttle for the remaining half of the value from previous mech bounties. fix: You can now no longer roll duplicates of the same bounties when generating a new bounty from the civilian bounty console. /:cl: --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> --- code/__DEFINES/medical.dm | 6 ++ code/__DEFINES/traits/declarations.dm | 5 ++ code/_globalvars/traits/_traits.dm | 4 +- code/game/machinery/civilian_bounties.dm | 27 +++++++- .../items/devices/scanners/health_analyzer.dm | 57 +++++++++++++++-- code/modules/cargo/bounties/assistant.dm | 59 +++++++++++++----- code/modules/cargo/bounties/item.dm | 24 +++++++ code/modules/cargo/bounties/mech.dm | 35 ----------- code/modules/cargo/bounties/mecha.dm | 45 +++++++++++++ code/modules/cargo/bounties/medical.dm | 20 ++++++ code/modules/cargo/bounty.dm | 12 ++-- code/modules/cargo/exports/mecha.dm | 24 +++++++ .../vehicles/mecha/mecha_diagnostic.dm | 26 ++++++++ code/modules/vehicles/mecha/mecha_ui.dm | 8 +++ code/modules/vehicles/mecha/working/ripley.dm | 1 + icons/obj/devices/scanner.dmi | Bin 26763 -> 30080 bytes tgstation.dme | 4 +- tgui/packages/tgui/interfaces/Mecha/data.ts | 1 + tgui/packages/tgui/interfaces/Mecha/index.tsx | 24 +++++-- 19 files changed, 307 insertions(+), 75 deletions(-) delete mode 100644 code/modules/cargo/bounties/mech.dm create mode 100644 code/modules/cargo/bounties/mecha.dm create mode 100644 code/modules/cargo/exports/mecha.dm create mode 100644 code/modules/vehicles/mecha/mecha_diagnostic.dm diff --git a/code/__DEFINES/medical.dm b/code/__DEFINES/medical.dm index 899de5c273f..c41e442c88f 100644 --- a/code/__DEFINES/medical.dm +++ b/code/__DEFINES/medical.dm @@ -25,3 +25,9 @@ MENTAL_UNSTABLE, \ MENTAL_INSANE, \ ) + +/// The percentage amount of health required for a mob to be considered to be +#define CLEAN_BILL_OF_HEALTH_RATIO 0.9 + +///Cooldown for being on the recently treated trait for the purposes for bounty submission +#define RECENTLY_HEALED_COOLDOWN 5 MINUTES diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index c0340db854b..f61063aa2d7 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -212,6 +212,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_ANTIMAGIC_NO_SELFBLOCK "anti_magic_no_selfblock" /// This mob recently blocked magic with some form of antimagic #define TRAIT_RECENTLY_BLOCKED_MAGIC "recently_blocked_magic" +/// This mob was recently treated and scanned by a medical scanner. +#define TRAIT_RECENTLY_TREATED "recently_treated" /// The user can do things like use magic staffs without penalty #define TRAIT_MAGICALLY_GIFTED "magically_gifted" /// This object innately spawns with fantasy variables already applied (the magical component is given to it on initialize), and thus we never want to give it the component again. @@ -1029,6 +1031,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///A trait for mechs that were created through the normal construction process, and not spawned by map or other effects. #define TRAIT_MECHA_CREATED_NORMALLY "trait_mecha_created_normally" +/// Trait to apply to mechs after a diagnostic scan has been created, to prevent you from generating duplicates of a scan on the same machine. +#define TRAIT_MECHA_DIAGNOSTIC_CREATED "trait_mecha_diagnostic_created" + /// Stops a movable from being removed from the mob it's in by the content_barfer component. #define TRAIT_NOT_BARFABLE "not_barfable" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 5f2fc6407c0..f0107820d5e 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -461,6 +461,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_RDS_SUPPRESSED" = TRAIT_RDS_SUPPRESSED, "TRAIT_REAGENT_SCANNER" = TRAIT_REAGENT_SCANNER, "TRAIT_RECENTLY_BLOCKED_MAGIC" = TRAIT_RECENTLY_BLOCKED_MAGIC, + "TRAIT_RECENTLY_TREATED" = TRAIT_RECENTLY_TREATED, "TRAIT_REGEN_SHIELD" = TRAIT_REGEN_SHIELD, "TRAIT_RELAYING_ATTACKER" = TRAIT_RELAYING_ATTACKER, "TRAIT_REMOTE_TASTING" = TRAIT_REMOTE_TASTING, @@ -739,7 +740,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_OREBOX_FUNCTIONAL" = TRAIT_OREBOX_FUNCTIONAL, ), /obj/vehicle/sealed/mecha = list( - "TRAIT_MECHA_CREATED_NORMALLY" = TRAIT_MECHA_CREATED_NORMALLY + "TRAIT_MECHA_CREATED_NORMALLY" = TRAIT_MECHA_CREATED_NORMALLY, + "TRAIT_MECHA_DIAGNOSTIC_CREATED" = TRAIT_MECHA_DIAGNOSTIC_CREATED, ), /turf = list( "TRAIT_CHASM_STOPPED" = TRAIT_CHASM_STOPPED, diff --git a/code/game/machinery/civilian_bounties.dm b/code/game/machinery/civilian_bounties.dm index 839151e7025..137010c5b14 100644 --- a/code/game/machinery/civilian_bounties.dm +++ b/code/game/machinery/civilian_bounties.dm @@ -160,12 +160,33 @@ if(!id_account.account_job) say("Requesting ID card has no job assignment registered!") return FALSE - var/list/datum/bounty/crumbs = list(random_bounty(id_account.account_job.bounty_types), // We want to offer 2 bounties from their appropriate job catagories - random_bounty(id_account.account_job.bounty_types), // and 1 guaranteed assistant bounty if the other 2 suck. - random_bounty(CIV_JOB_BASIC)) + + var/list/datum/bounty/crumbs = generate_bounty_list(id_account.account_job.bounty_types) COOLDOWN_START(id_account, bounty_timer, (5 MINUTES) - cooldown_reduction) id_account.bounties = crumbs +/** + * Generates a list of bounties for use with the civilian bounty pad. + * @param bounty_types the define taken from a job for selection of a random_bounty() proc. + * @param bounty_rolls the number of bounties to be selected from. + * @param assistant_failsafe Do we guarentee one assistant bounty per generated list? Used for non-assistant jobs to give an easier alternative to that job's default bounties. + */ +/obj/machinery/computer/piratepad_control/civilian/proc/generate_bounty_list(bounty_types, bounty_rolls = 3, assistant_failsafe = TRUE) + var/list/rolling_list = list() + if(assistant_failsafe) + rolling_list += random_bounty(CIV_JOB_BASIC) + while(bounty_rolls > 1) + var/datum/bounty/potential_bounty = random_bounty(bounty_types) + var/repeats_bool = FALSE + for(var/datum/iterator in rolling_list) + if(iterator.type == potential_bounty.type) + repeats_bool = TRUE + if(repeats_bool) + continue + rolling_list += potential_bounty + bounty_rolls -= 1 + return rolling_list + /** * Proc that assigned a civilian bounty to an ID card, from the list of potential bounties that that bank account currently has available. * Available choices are assigned during add_bounties, and one is locked in here. diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index a6487eb77cc..2d3208ad2a2 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -32,6 +32,8 @@ var/give_wound_treatment_bonus = FALSE var/last_scan_text var/scanner_busy = FALSE + /// Weakref to the last mob scanned by a health analyzer. Used to generate official medical reports. + var/datum/weakref/last_healthy_scanned /obj/item/healthanalyzer/Initialize(mapload) . = ..() @@ -97,6 +99,10 @@ switch (scanmode) if (SCANMODE_HEALTH) last_scan_text = healthscan(user, M, mode, advanced, tochat = readability_check) + if((M.health / M.maxHealth) > CLEAN_BILL_OF_HEALTH_RATIO) + last_healthy_scanned = WEAKREF(M) + else + last_healthy_scanned = null if (SCANMODE_WOUND) if(readability_check) woundscan(user, M, src) @@ -423,10 +429,10 @@ return scanner_busy = TRUE balloon_alert(user, "printing report...") - addtimer(CALLBACK(src, PROC_REF(print_report)), 2 SECONDS) + addtimer(CALLBACK(src, PROC_REF(print_report), user), 2 SECONDS) /obj/item/healthanalyzer/proc/print_report(mob/user) - var/obj/item/paper/report_paper = new(get_turf(src)) + var/obj/item/paper/medical_report/report_paper = new(get_turf(src)) report_paper.color = "#99ccff" report_paper.name = "health scan report - [station_time_timestamp()]" @@ -436,14 +442,41 @@ report_paper.add_raw_text(report_text) report_paper.update_appearance() - if(ismob(loc)) - var/mob/printer = loc - printer.put_in_hands(report_paper) - balloon_alert(printer, "logs cleared") + user.put_in_hands(report_paper) + balloon_alert(user, "logs cleared") + resolve_patient_eligibility(report_paper, user) report_text = list() scanner_busy = FALSE +/** + * Checks the mob and the medical report that the scanner is trying to print, checks the traits and statuses of the mob, and then resolves by true or false. + * Applies traits to the patient if the scanning is eligable to turn in for a bounty, with callbacks to remove after a cooldown. + */ +/obj/item/healthanalyzer/proc/resolve_patient_eligibility(obj/item/paper/medical_report/report_paper, mob/scanner) + var/mob/living/patient = last_healthy_scanned?.resolve() + if(!patient) + return FALSE + + if(scanner == patient) + return FALSE //You can't just scan yourself. + + if(HAS_TRAIT(patient, TRAIT_RECENTLY_TREATED)) + return FALSE + + report_paper.last_healthy_scanned_mob = last_healthy_scanned + ADD_TRAIT(patient, TRAIT_RECENTLY_TREATED, ANALYZER_TRAIT) + addtimer(TRAIT_CALLBACK_REMOVE(patient, RECENTLY_HEALED_COOLDOWN, ANALYZER_TRAIT), RECENTLY_HEALED_COOLDOWN) + return TRUE + +/obj/item/healthanalyzer/proc/clear_treatment(mob/living/target) + if(!target) + return + if(QDELETED(target)) + return + REMOVE_TRAIT(target, TRAIT_RECENTLY_TREATED, ANALYZER_TRAIT) + return TRUE + /proc/chemscan(mob/living/user, mob/living/target) if(user.incapacitated) return @@ -719,6 +752,18 @@ scanner.emotion = AID_EMOTION_WARN playsound(scanner, 'sound/machines/beep/twobeep.ogg', 50, FALSE) +/obj/item/paper/medical_report + color = "#99ccff" + desc = "An official medical bill of health generated by a computerized medical scanner." + /// A reference to a mob's weakref that was last scanned by the medical scanner. + var/datum/weakref/last_healthy_scanned_mob + +/obj/item/paper/medical_report/examine(mob/user) + . = ..() + if(last_healthy_scanned_mob) + . += span_notice("This medical report is applicable for medical bounties.") + + #undef SCANMODE_HEALTH #undef SCANMODE_WOUND #undef SCANMODE_COUNT diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm index ca77572cb93..c9afa204fd6 100644 --- a/code/modules/cargo/bounties/assistant.dm +++ b/code/modules/cargo/bounties/assistant.dm @@ -41,11 +41,41 @@ wanted_types = list(/obj/item/spear = TRUE) /datum/bounty/item/assistant/toolbox - name = "Toolboxes" - description = "There's an absence of robustness at Central Command. Hurry up and ship some toolboxes as a solution." + name = "Stocked Toolbox" + description = "There's an absence of robustness at Central Command. Ship them a fully packed toolbox as a solution, containing a screwdriver, wrench, welding tool, crowbar, analyzer, and wirecutters." reward = CARGO_CRATE_VALUE * 4 - required_count = 6 wanted_types = list(/obj/item/storage/toolbox = TRUE) + /// Typecache of tools that we want to see sorted into a toolbox. Unpacked in New(), verified in applies_to(), and then contents are filtered out in ship(). + var/list/static_packing_list = list( + /obj/item/screwdriver = TRUE, + /obj/item/wrench = TRUE, + /obj/item/weldingtool = TRUE, + /obj/item/crowbar = TRUE, + /obj/item/analyzer = TRUE, + /obj/item/wirecutters = TRUE, + ) + +/datum/bounty/item/assistant/toolbox/New() + . = ..() + static_packing_list = string_assoc_list(zebra_typecacheof(static_packing_list, only_root_path = FALSE)) + +/datum/bounty/item/assistant/toolbox/applies_to(obj/shipped) + var/list/packing_list = static_packing_list.Copy() + for(var/obj/item_contents as anything in shipped.contents) + if(is_type_in_typecache(item_contents.type, packing_list)) + packing_list -= subtypesof(item_contents.type) + packing_list -= item_contents.type + if(!length(packing_list)) + return ..() + + return FALSE + +/datum/bounty/item/assistant/toolbox/ship(obj/shipped) + . = ..() + for(var/obj/object as anything in shipped.contents) + if(!is_type_in_typecache(object.type, static_packing_list)) + object.forceMove(shipped.drop_location()) + /datum/bounty/item/assistant/statue name = "Statue" @@ -133,8 +163,11 @@ name = "Potted Plants" description = "Central Command is looking to commission a new BirdBoat-class station. You've been ordered to supply the potted plants." reward = CARGO_CRATE_VALUE * 4 - required_count = 8 - wanted_types = list(/obj/item/kirbyplants = TRUE) + required_count = 3 + wanted_types = list( + /obj/item/kirbyplants = TRUE, + /obj/item/kirbyplants/synthetic = FALSE + ) /datum/bounty/item/assistant/monkey_cubes name = "Monkey Cubes" @@ -156,12 +189,12 @@ reward = CARGO_CRATE_VALUE * 6 wanted_types = list(/obj/item/food/meat/slab/corgi = TRUE) -/datum/bounty/item/assistant/action_figures - name = "Action Figures" - description = "The vice president's son saw an ad for action figures on the telescreen and now he won't shut up about them. Ship some to ease his complaints." +/datum/bounty/item/assistant/toys + name = "Arcade Toys" + description = "The vice president's son saw an ad for new toys on the telescreen and now he won't shut up about them. Ship some arcade toys over to ease his complaints." reward = CARGO_CRATE_VALUE * 8 required_count = 5 - wanted_types = list(/obj/item/toy/figure = TRUE) + wanted_types = list(/obj/item/toy = TRUE) /datum/bounty/item/assistant/paper_bin name = "Paper Bins" @@ -177,14 +210,6 @@ required_count = 8 wanted_types = list(/obj/item/toy/crayon = TRUE) -/datum/bounty/item/assistant/pens - name = "Pens" - description = "We are hosting the intergalactic pen balancing competition. We need you to send us some standardized black ballpoint pens." - reward = CARGO_CRATE_VALUE * 4 - required_count = 10 - include_subtypes = FALSE - wanted_types = list(/obj/item/pen = TRUE) - /datum/bounty/item/assistant/water_tank name = "Water Tank" description = "We need more water for our hydroponics bay. Find a water tank and ship it out to us." diff --git a/code/modules/cargo/bounties/item.dm b/code/modules/cargo/bounties/item.dm index eefc78b9d5e..1fb1df9104d 100644 --- a/code/modules/cargo/bounties/item.dm +++ b/code/modules/cargo/bounties/item.dm @@ -35,3 +35,27 @@ /// If the user can actually get this bounty as a selection. /datum/bounty/proc/can_get() return TRUE + +/** + * Debug item because it took less time to code this than it did to roll ONE toolbox bounty. + */ +/obj/item/bounty_voucher + name = "bounty voucher" + desc = "A certificate for ONE FREE BOUNTY of your choice! Wow!" + icon = 'icons/obj/service/bureaucracy.dmi' + icon_state = "paperslip_words" + +/obj/item/bounty_voucher/attack_self(mob/user, modifiers) + . = ..() + if(!isliving(user)) + return + var/mob/living/living_user = user + var/obj/item/card/id/id = living_user.get_idcard() + if(!id?.registered_account) + return + var/choice = tgui_input_list(living_user, "Choose a bounty.", "New Bounty", subtypesof(/datum/bounty)) + var/datum/bounty/new_chore = text2path("[choice]") + id.registered_account.civilian_bounty = new new_chore + balloon_alert(user, "new bounty acquired!") + playsound(src, 'sound/effects/coin2.ogg', 30, TRUE) + qdel(src) diff --git a/code/modules/cargo/bounties/mech.dm b/code/modules/cargo/bounties/mech.dm deleted file mode 100644 index 84ed9eebe92..00000000000 --- a/code/modules/cargo/bounties/mech.dm +++ /dev/null @@ -1,35 +0,0 @@ -/datum/bounty/item/mech/New() - ..() - description = "Upper management has requested one [name] mech be sent as soon as possible. Ship it to receive a large payment." - -/datum/bounty/item/mech/ship(obj/shipped) - . = ..() - if(!.) - return - var/obj/vehicle/sealed/mecha/mecha = shipped - mecha.wreckage = null // So the mech doesn't explode. - -/datum/bounty/item/mech/ripleymk2 - name = "APLU MK-II \"Ripley\"" - reward = CARGO_CRATE_VALUE * 26 - wanted_types = list(/obj/vehicle/sealed/mecha/ripley/mk2 = TRUE) - -/datum/bounty/item/mech/clarke - name = "Clarke" - reward = CARGO_CRATE_VALUE * 32 - wanted_types = list(/obj/vehicle/sealed/mecha/clarke = TRUE) - -/datum/bounty/item/mech/odysseus - name = "Odysseus" - reward = CARGO_CRATE_VALUE * 22 - wanted_types = list(/obj/vehicle/sealed/mecha/odysseus = TRUE) - -/datum/bounty/item/mech/gygax - name = "Gygax" - reward = CARGO_CRATE_VALUE * 56 - wanted_types = list(/obj/vehicle/sealed/mecha/gygax = TRUE) - -/datum/bounty/item/mech/durand - name = "Durand" - reward = CARGO_CRATE_VALUE * 40 - wanted_types = list(/obj/vehicle/sealed/mecha/durand = TRUE) diff --git a/code/modules/cargo/bounties/mecha.dm b/code/modules/cargo/bounties/mecha.dm new file mode 100644 index 00000000000..fc211810d4a --- /dev/null +++ b/code/modules/cargo/bounties/mecha.dm @@ -0,0 +1,45 @@ +/datum/bounty/item/mech + wanted_types = list(/obj/item/mecha_diagnostic = TRUE) + /// What mech do we need data of inside this mecha diagnostic? + var/required_data = null + +/datum/bounty/item/mech/New() + ..() + description = "Upper management has requested holodiagnostic scans of \a [name] mech be sent as soon as possible. A diagnostic holoscan can be generated from inside a new mecha. Ship it to receive a large payment." + +/datum/bounty/item/mech/applies_to(obj/shipped) + . = ..() + if(istype(shipped, /obj/vehicle/sealed/mecha)) + shipped.balloon_alert_to_viewers("make diagnostic from inside!") + + var/obj/item/mecha_diagnostic/diagnostic_sheet = shipped + if(!diagnostic_sheet.mech_data) + CRASH("Diagnostic sheet submitted with no mech data contained!") + if(istype(diagnostic_sheet.mech_data, required_data)) + return TRUE + return FALSE + +/datum/bounty/item/mech/ripleymk2 + name = "APLU MK-II \"Ripley\"" + reward = CARGO_CRATE_VALUE * 6.5 + required_data = /obj/vehicle/sealed/mecha/ripley/mk2 + +/datum/bounty/item/mech/clarke + name = "Clarke" + reward = CARGO_CRATE_VALUE * 12 + required_data = /obj/vehicle/sealed/mecha/clarke + +/datum/bounty/item/mech/odysseus + name = "Odysseus" + reward = CARGO_CRATE_VALUE * 5.5 + required_data = /obj/vehicle/sealed/mecha/odysseus + +/datum/bounty/item/mech/gygax + name = "Gygax" + reward = CARGO_CRATE_VALUE * 28 + required_data = /obj/vehicle/sealed/mecha/gygax + +/datum/bounty/item/mech/durand + name = "Durand" + reward = CARGO_CRATE_VALUE * 20 + required_data = /obj/vehicle/sealed/mecha/durand diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm index d15f4405f7b..c3106c426b2 100644 --- a/code/modules/cargo/bounties/medical.dm +++ b/code/modules/cargo/bounties/medical.dm @@ -104,3 +104,23 @@ description = "After a recent influx of infected crew members, we've seen that masks just aren't cutting it alone. Silver operating tables might just do the trick though, send us one to use." reward = CARGO_CRATE_VALUE * 6 wanted_types = list(/obj/structure/table/optable = TRUE) + +/datum/bounty/item/medical/scanning + name = "Crew Medical Scanning" + description = "Conduct a routine medical scan using any health analyzer of a crew member with with a near perfect bill of health or better to ensure the crew is taking their medical care seriously. Then, print the medical report and ship it back to us." + reward = CARGO_CRATE_VALUE * 8 + required_count = 2 + wanted_types = list(/obj/item/paper/medical_report = TRUE) + +/datum/bounty/item/medical/scanning/applies_to(obj/shipped) + . = ..() + if(!istype(shipped, /obj/item/paper/medical_report)) + return FALSE + var/obj/item/paper/medical_report/report = shipped + if(!report) + return FALSE + + var/mob/living/patient = report.last_healthy_scanned_mob?.resolve() + if(patient) + return TRUE + return FALSE diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm index 38b26e44027..b90e8816a1f 100644 --- a/code/modules/cargo/bounty.dm +++ b/code/modules/cargo/bounty.dm @@ -19,26 +19,26 @@ D.adjust_money(reward * SSeconomy.bounty_modifier) claimed = TRUE -/// If an item sent in the cargo shuttle can satisfy the bounty. +/// If an item in question can satisfy the bounty. /datum/bounty/proc/applies_to(obj/O) return FALSE -/// Called when an object is shipped on the cargo shuttle. +/// Called when an object is sent on the bounty pad. /datum/bounty/proc/ship(obj/O) return /** Returns a new bounty of random type, but does not add it to GLOB.bounties_list. * - * *Guided determines what specific catagory of bounty should be chosen. + * * Category determines what specific catagory of bounty should be chosen. */ -/proc/random_bounty(guided = 0) +/proc/random_bounty(category = 0) var/bounty_num var/chosen_type var/bounty_succeeded = FALSE var/datum/bounty/item/bounty_ref while(!bounty_succeeded) - if(guided && (guided != CIV_JOB_RANDOM)) - bounty_num = guided + if(category && (category != CIV_JOB_RANDOM)) + bounty_num = category else bounty_num = rand(1, MAXIMUM_BOUNTY_JOBS) switch(bounty_num) diff --git a/code/modules/cargo/exports/mecha.dm b/code/modules/cargo/exports/mecha.dm new file mode 100644 index 00000000000..06eb94401a6 --- /dev/null +++ b/code/modules/cargo/exports/mecha.dm @@ -0,0 +1,24 @@ +/datum/export/mecha/ripley + cost = CARGO_CRATE_VALUE * 13 + unit_name = "APLU MK-II Ripley" + export_types = list(/obj/vehicle/sealed/mecha/ripley/mk2) + +/datum/export/mecha/clarke + cost = CARGO_CRATE_VALUE * 16 + unit_name = "Clarke" + export_types = list(/obj/vehicle/sealed/mecha/clarke) + +/datum/export/mecha/odysseus + cost = CARGO_CRATE_VALUE * 11 + unit_name = "Odysseus" + export_types = list(/obj/vehicle/sealed/mecha/odysseus) + +/datum/export/mecha/gygax + cost = CARGO_CRATE_VALUE * 28 + unit_name = "Gygax" + export_types = list(/obj/vehicle/sealed/mecha/gygax) + +/datum/export/mecha/durand + cost = CARGO_CRATE_VALUE * 20 + unit_name = "Durand" + export_types = list(/obj/vehicle/sealed/mecha/durand) diff --git a/code/modules/vehicles/mecha/mecha_diagnostic.dm b/code/modules/vehicles/mecha/mecha_diagnostic.dm new file mode 100644 index 00000000000..7252a361b77 --- /dev/null +++ b/code/modules/vehicles/mecha/mecha_diagnostic.dm @@ -0,0 +1,26 @@ +/obj/item/mecha_diagnostic + name = "mecha holodiagnostic" + desc = "A holographic datasheet of unique data related to the mecha's construction and any production differences between the published designs to increment improvements." + icon = 'icons/obj/devices/scanner.dmi' + icon_state = "holosheet" + w_class = WEIGHT_CLASS_SMALL + layer = ABOVE_MOB_LAYER + light_system = OVERLAY_LIGHT + light_range = 1 + light_power = 2 + light_color = "#79aeeb" + /// What mech was this diagnostic sheet generated from? Used for applicability in bounties. + var/obj/vehicle/sealed/mecha/mech_data + +/obj/item/mecha_diagnostic/Initialize(mapload) + . = ..() + set_light_on(TRUE) + +/obj/item/mecha_diagnostic/Destroy(force) + . = ..() + mech_data = null + +/obj/item/mecha_diagnostic/examine(mob/user) + . = ..() + if(mech_data) + . += "This holodata sheet consists of data from a [initial(mech_data.name)]." diff --git a/code/modules/vehicles/mecha/mecha_ui.dm b/code/modules/vehicles/mecha/mecha_ui.dm index 41d858e5ebe..a3bfb9f97bc 100644 --- a/code/modules/vehicles/mecha/mecha_ui.dm +++ b/code/modules/vehicles/mecha/mecha_ui.dm @@ -60,6 +60,7 @@ "MECHA_INT_CONTROL_LOST" = MECHA_INT_CONTROL_LOST, "MECHA_INT_SHORT_CIRCUIT" = MECHA_INT_SHORT_CIRCUIT, ) + data["diagnostic_status"] = HAS_TRAIT(src, TRAIT_MECHA_DIAGNOSTIC_CREATED) var/list/regions = list() var/list/tgui_region_data = SSid_access.all_region_access_tgui @@ -225,5 +226,12 @@ if("equip_act") var/obj/item/mecha_parts/mecha_equipment/gear = locate(params["ref"]) in flat_equipment return gear?.ui_act(params["gear_action"], params, ui, state) + if("diagnostic") + if(HAS_TRAIT(src, TRAIT_MECHA_DIAGNOSTIC_CREATED)) + return FALSE + var/obj/item/mecha_diagnostic/diagnostic = new /obj/item/mecha_diagnostic(get_turf(src)) + diagnostic.name = "mecha holodiagnostic ([src.name])" + diagnostic.mech_data += src + ADD_TRAIT(src, TRAIT_MECHA_DIAGNOSTIC_CREATED, REF(src)) return TRUE diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm index 29bc3fb4d48..b201e323fdd 100644 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -276,6 +276,7 @@ GLOBAL_DATUM(cargo_ripley, /obj/vehicle/sealed/mecha/ripley/cargo) take_damage(max_integrity * 0.5, sound_effect=FALSE) //Low starting health if(!GLOB.cargo_ripley && mapload) GLOB.cargo_ripley = src + ADD_TRAIT(src, TRAIT_MECHA_DIAGNOSTIC_CREATED, REF(src)) //It was built *long* before the shift started. /obj/vehicle/sealed/mecha/ripley/cargo/Destroy() if(GLOB.cargo_ripley == src) diff --git a/icons/obj/devices/scanner.dmi b/icons/obj/devices/scanner.dmi index dd947699481d90f495638b9313c81675e1e41f6e..c5a1ec683248996d4b88779881239b9a63398a50 100644 GIT binary patch literal 30080 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 diff --git a/tgstation.dme b/tgstation.dme index 4fd22f28eb7..b25780c4564 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3760,7 +3760,7 @@ #include "code\modules\cargo\bounties\chef.dm" #include "code\modules\cargo\bounties\engineering.dm" #include "code\modules\cargo\bounties\item.dm" -#include "code\modules\cargo\bounties\mech.dm" +#include "code\modules\cargo\bounties\mecha.dm" #include "code\modules\cargo\bounties\medical.dm" #include "code\modules\cargo\bounties\mining.dm" #include "code\modules\cargo\bounties\reagent.dm" @@ -3779,6 +3779,7 @@ #include "code\modules\cargo\exports\lavaland.dm" #include "code\modules\cargo\exports\manifest.dm" #include "code\modules\cargo\exports\materials.dm" +#include "code\modules\cargo\exports\mecha.dm" #include "code\modules\cargo\exports\organs.dm" #include "code\modules\cargo\exports\parts.dm" #include "code\modules\cargo\exports\seeds.dm" @@ -6368,6 +6369,7 @@ #include "code\modules\vehicles\mecha\mecha_control_console.dm" #include "code\modules\vehicles\mecha\mecha_damage.dm" #include "code\modules\vehicles\mecha\mecha_defense.dm" +#include "code\modules\vehicles\mecha\mecha_diagnostic.dm" #include "code\modules\vehicles\mecha\mecha_helpers.dm" #include "code\modules\vehicles\mecha\mecha_mob_interaction.dm" #include "code\modules\vehicles\mecha\mecha_movement.dm" diff --git a/tgui/packages/tgui/interfaces/Mecha/data.ts b/tgui/packages/tgui/interfaces/Mecha/data.ts index 9832eff273f..07e84b1d66f 100644 --- a/tgui/packages/tgui/interfaces/Mecha/data.ts +++ b/tgui/packages/tgui/interfaces/Mecha/data.ts @@ -54,6 +54,7 @@ export type MainData = { modules: MechModule[]; selected_module_index: number; sheet_material_amount: number; + diagnostic_status: BooleanLike; }; export type MechModule = { diff --git a/tgui/packages/tgui/interfaces/Mecha/index.tsx b/tgui/packages/tgui/interfaces/Mecha/index.tsx index 0bf81298b72..47e996510d1 100644 --- a/tgui/packages/tgui/interfaces/Mecha/index.tsx +++ b/tgui/packages/tgui/interfaces/Mecha/index.tsx @@ -38,6 +38,7 @@ export const Content = (props) => { one_access, regions, accesses, + diagnostic_status, } = data; const id_lock = mecha_flags & mechflag_keys['ID_LOCK_ON']; return ( @@ -49,12 +50,23 @@ export const Content = (props) => { fill title={name} buttons={ -