diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 739855464ee..af91f62d75b 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -39,8 +39,9 @@ #define ROLE_SPACE_DRAGON "Space Dragon" #define ROLE_SPIDER "Spider" #define ROLE_WIZARD_MIDROUND "Wizard (Midround)" -// SKYRAT EDIT ADDITION +//SKYRAT EDIT START #define ROLE_BORER "Borer" +#define ROLE_DRIFTING_CONTRACTOR "Drifting Contractor" #define ROLE_ASSAULT_OPERATIVE "Assault Operative" // SKYRAT EDIT END @@ -146,8 +147,10 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_SPACE_DRAGON = 0, ROLE_SPIDER = 0, ROLE_WIZARD_MIDROUND = 14, - //SKYRAT EDIT: Cortical Borers + //SKYRAT EDIT START ROLE_BORER = 0, + ROLE_DRIFTING_CONTRACTOR = 14, + //SKYRAT EDIT END // Latejoin ROLE_HERETIC_SMUGGLER = 0, diff --git a/code/__DEFINES/~skyrat_defines/baton_upgrades.dm b/code/__DEFINES/~skyrat_defines/baton_upgrades.dm index dcfbfbabe45..ed89f1b4a51 100644 --- a/code/__DEFINES/~skyrat_defines/baton_upgrades.dm +++ b/code/__DEFINES/~skyrat_defines/baton_upgrades.dm @@ -1,3 +1,4 @@ #define BATON_ALL_UPGRADE (1<<0) #define BATON_CUFF_UPGRADE (1<<1) #define BATON_MUTE_UPGRADE (1<<2) +#define BATON_FOCUS_UPGRADE (1<<3) diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 057407d5d45..d21424345d5 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -252,22 +252,22 @@ new /obj/item/implanter/freedom(src) new /obj/item/stack/telecrystal(src) //The failsafe/self destruct isn't an item we can physically include in the kit, but 1 TC is technically enough to buy the equivalent. -/obj/item/storage/box/syndicate/contract_kit +/obj/item/storage/box/syndicate/contract_kit //SKYRAT EDIT - CHANGED IN MODULAR FOLDER name = "Contract Kit" desc = "Supplied to Syndicate contractors." icon_state = "syndiebox" illustration = "writing_syndie" -/obj/item/storage/box/syndicate/contractor_loadout +/obj/item/storage/box/syndicate/contractor_loadout //SKYRAT EDIT - CHANGED IN MODULAR FOLDER name = "Standard Loadout" desc = "Supplied to Syndicate contractors, providing their specialised space suit and chameleon uniform." icon_state = "syndiebox" illustration = "writing_syndie" -/obj/item/paper/contractor_guide +/obj/item/paper/contractor_guide //SKYRAT EDIT - CHANGED IN MODULAR FOLDER name = "Contractor Guide" -/obj/item/paper/contractor_guide/Initialize(mapload) +/obj/item/paper/contractor_guide/Initialize(mapload) //SKYRAT EDIT - CHANGED IN MODULAR FOLDER info = {"

Welcome agent, congratulations on your new position as contractor. On top of your already assigned objectives, this kit will provide you contracts to take on for TC payments.

diff --git a/code/modules/client/preferences/middleware/antags.dm b/code/modules/client/preferences/middleware/antags.dm index b782397fd5b..1014ca64496 100644 --- a/code/modules/client/preferences/middleware/antags.dm +++ b/code/modules/client/preferences/middleware/antags.dm @@ -115,6 +115,7 @@ var/static/list/non_ruleset_antagonists = list( ROLE_FUGITIVE = /datum/antagonist/fugitive, ROLE_LONE_OPERATIVE = /datum/antagonist/nukeop/lone, + ROLE_DRIFTING_CONTRACTOR = /datum/antagonist/contractor, //SKYRAT EDIT ) var/list/antagonists = non_ruleset_antagonists.Copy() diff --git a/modular_skyrat/master_files/icons/obj/card.dmi b/modular_skyrat/master_files/icons/obj/card.dmi index d06ee7d6e0a..6c7cc91aa4e 100644 Binary files a/modular_skyrat/master_files/icons/obj/card.dmi and b/modular_skyrat/master_files/icons/obj/card.dmi differ diff --git a/modular_skyrat/modules/contractor/code/datums/contractor_items.dm b/modular_skyrat/modules/contractor/code/datums/contractor_items.dm index 9ed9228165d..a50a523b5ef 100644 --- a/modular_skyrat/modules/contractor/code/datums/contractor_items.dm +++ b/modular_skyrat/modules/contractor/code/datums/contractor_items.dm @@ -149,7 +149,7 @@ desc = "Request Syndicate Command to distrupt the station's powernet. Disables power across the station for a short duration." item_icon = "bolt" limited = 2 - cost = 3 + cost = 2 /datum/contractor_item/blackout/handle_purchase(datum/contractor_hub/hub) . = ..() @@ -164,7 +164,7 @@ desc = "Request Syndicate Command to disable station Telecommunications. Disables telecommunications across the station for a medium duration." item_icon = "phone-slash" limited = 2 - cost = 3 + cost = 2 /datum/contractor_item/comms_blackout/handle_purchase(datum/contractor_hub/hub) . = ..() @@ -178,7 +178,7 @@ name = "Baton Holster Module" desc = "Never worry about dropping your baton again with this holster module! Simply insert your baton into the module, put it in your MODsuit, and the baton will retract whenever dropped." item = /obj/item/mod/module/baton_holster - item_icon = "arrow-up-from-arc" //I cannot find anything better, replace if you find something more fitting + item_icon = "wrench" //I cannot find anything better, replace if you find something more fitting limited = 1 cost = 1 @@ -186,7 +186,7 @@ name = "Baton Cuff Upgrade" desc = "Using technology reverse-engineered from some alien batons we had lying around, you can now cuff people using your baton with the secondary attack. Due to technical limitations, only cable cuffs and zipties work, and they need to be loaded into the baton manually." item = /obj/item/baton_upgrade/cuff - item_icon = "handcuff" + item_icon = "hands-bound" limited = 1 cost = 1 @@ -197,3 +197,11 @@ item_icon = "comment-slash" limited = 1 cost = 2 + +/datum/contractor_item/baton_upgrade_focus + name = "Baton Focus Upgrade" + desc = "When applied to a baton, it will exhaust the target even more, should they be the target of your current contract." + item = /obj/item/baton_upgrade/focus + item_icon = "eye" + limited = 1 + cost = 2 diff --git a/modular_skyrat/modules/contractor/code/datums/midround/antag_datum.dm b/modular_skyrat/modules/contractor/code/datums/midround/antag_datum.dm new file mode 100644 index 00000000000..852226a83aa --- /dev/null +++ b/modular_skyrat/modules/contractor/code/datums/midround/antag_datum.dm @@ -0,0 +1,31 @@ +// USED FOR THE MIDROUND +/datum/antagonist/contractor + name = "Drifting Contractor" + antagpanel_category = "DriftingContractor" + preview_outfit = /datum/outfit/contractor_preview + job_rank = ROLE_DRIFTING_CONTRACTOR + hud_icon = 'modular_skyrat/modules/contractor/icons/hud_icon.dmi' + antag_hud_name = "contractor" + antag_moodlet = /datum/mood_event/focused + show_to_ghosts = TRUE + suicide_cry = "FOR THE CONTRACTS!!" + /// The outfit the contractor is equipped with + var/contractor_outfit = /datum/outfit/contractor + +/datum/antagonist/contractor/proc/equip_guy() + if(!ishuman(owner.current)) + return + var/mob/living/carbon/human/person = owner.current + person.equipOutfit(contractor_outfit) + return TRUE + +/datum/antagonist/contractor/on_gain() + forge_objectives() + . = ..() + equip_guy() + +/datum/antagonist/contractor/proc/forge_objectives() + objectives += new/datum/objective/contractor_total + +/datum/job/drifting_contractor + title = ROLE_DRIFTING_CONTRACTOR diff --git a/modular_skyrat/modules/contractor/code/datums/midround/event.dm b/modular_skyrat/modules/contractor/code/datums/midround/event.dm new file mode 100644 index 00000000000..74f033d3bdb --- /dev/null +++ b/modular_skyrat/modules/contractor/code/datums/midround/event.dm @@ -0,0 +1,38 @@ +/datum/round_event_control/contractor + name = "Drifting Contractor" + typepath = /datum/round_event/ghost_role/contractor + weight = 8 + max_occurrences = 1 + +/datum/round_event/ghost_role/contractor + minimum_required = 1 + role_name = "Drifting Contractor" + fakeable = FALSE + +/datum/round_event/ghost_role/contractor/spawn_role() + var/list/candidates = get_candidates(ROLE_DRIFTING_CONTRACTOR) + if(!length(candidates)) + return NOT_ENOUGH_PLAYERS + + var/mob/dead/selected = pick_n_take(candidates) + + var/list/spawn_locs = list() + for(var/obj/effect/landmark/carpspawn/carp in GLOB.landmarks_list) + spawn_locs += carp.loc + if(!length(spawn_locs)) + return MAP_ERROR + + var/mob/living/carbon/human/operative = new(pick(spawn_locs)) + operative.randomize_human_appearance(~RANDOMIZE_SPECIES) + operative.dna.update_dna_identity() + var/datum/mind/mind = new /datum/mind(selected.key) + mind.set_assigned_role(SSjob.GetJobType(/datum/job/drifting_contractor)) + mind.special_role = ROLE_DRIFTING_CONTRACTOR + mind.active = TRUE + mind.transfer_to(operative) + mind.add_antag_datum(/datum/antagonist/contractor) + + message_admins("[ADMIN_LOOKUPFLW(operative)] has been made into [src] by an event.") + log_game("[key_name(operative)] was spawned as a [src] by an event.") + spawned_mobs += operative + return SUCCESSFUL_SPAWN diff --git a/modular_skyrat/modules/contractor/code/datums/midround/objective.dm b/modular_skyrat/modules/contractor/code/datums/midround/objective.dm new file mode 100644 index 00000000000..441307abb1a --- /dev/null +++ b/modular_skyrat/modules/contractor/code/datums/midround/objective.dm @@ -0,0 +1,17 @@ +/datum/objective/contractor_total + name = "contractor" + explanation_text = "Complete at least %CONTRACTNUM% contract%S%." + martyr_compatible = TRUE + /// How many contracts are needed, rand(1, 3) + var/contracts_needed + +/datum/objective/contractor_total/New(text) + . = ..() + contracts_needed = rand(1, 3) + explanation_text = replacetext(explanation_text, "%CONTRACTNUM%", contracts_needed) + explanation_text = replacetext(explanation_text, "%S%", (contracts_needed > 1 ? "S" : "")) + +/datum/objective/contractor_total/check_completion() + if(length(owner.opposing_force.contractor_hub.contracts_completed) >= contracts_needed) + return TRUE + return FALSE diff --git a/modular_skyrat/modules/contractor/code/datums/midround/outfit.dm b/modular_skyrat/modules/contractor/code/datums/midround/outfit.dm new file mode 100644 index 00000000000..5d4d732905b --- /dev/null +++ b/modular_skyrat/modules/contractor/code/datums/midround/outfit.dm @@ -0,0 +1,40 @@ +/datum/outfit/contractor + name = "Syndicate Contractor - Full Kit" + + glasses = /obj/item/clothing/glasses/night + mask = /obj/item/clothing/mask/chameleon + back = /obj/item/mod/control/pre_equipped/contractor/upgraded + r_pocket = /obj/item/tank/internals/emergency_oxygen/engi + internals_slot = ITEM_SLOT_RPOCKET + belt = /obj/item/storage/belt/military + + uniform = /obj/item/clothing/under/chameleon + shoes = /obj/item/clothing/shoes/chameleon/noslip + gloves = /obj/item/clothing/gloves/combat + ears = /obj/item/radio/headset/chameleon/advanced + l_pocket = /obj/item/modular_computer/tablet/syndicate_contract_uplink/preset/uplink + id = /obj/item/card/id/advanced/chameleon + backpack_contents = list( + /obj/item/storage/box/survival/syndie, + /obj/item/storage/box/syndicate/contract_kit/midround, + /obj/item/knife/combat/survival, + ) + + implants = list( + /obj/item/implant/uplink/precharged, + /obj/item/implant/explosive, + ) + + id_trim = /datum/id_trim/chameleon/contractor + +/datum/outfit/contractor_preview + name = "Syndicate Contractor (Preview only)" + + back = /obj/item/mod/control/pre_equipped/syndicate_empty/contractor + uniform = /obj/item/clothing/under/syndicate + glasses = /obj/item/clothing/glasses/night + +/datum/outfit/contractor_preview/post_equip(mob/living/carbon/human/guy, visualsOnly) + var/obj/item/mod/module/armor_booster/booster = locate() in guy.back + booster.active = TRUE + guy.update_inv_back() diff --git a/modular_skyrat/modules/contractor/code/datums/midround/trim.dm b/modular_skyrat/modules/contractor/code/datums/midround/trim.dm new file mode 100644 index 00000000000..d03b45b2d8f --- /dev/null +++ b/modular_skyrat/modules/contractor/code/datums/midround/trim.dm @@ -0,0 +1,5 @@ +/// Trim for Chameleon ID cards. Many outfits, nuke ops and some corpses hold Chameleon ID cards. +/datum/id_trim/chameleon/contractor + assignment = "Syndicate Contractor" + trim_state = "trim_contractor" + trim_icon = 'modular_skyrat/master_files/icons/obj/card.dmi' diff --git a/modular_skyrat/modules/contractor/code/items/baton.dm b/modular_skyrat/modules/contractor/code/items/baton.dm index 0cd2e272a11..bbb04386a3e 100644 --- a/modular_skyrat/modules/contractor/code/items/baton.dm +++ b/modular_skyrat/modules/contractor/code/items/baton.dm @@ -1,11 +1,20 @@ #define CUFF_MAXIMUM 3 #define MUTE_CYCLES 5 +#define MUTE_MAX_MOD 2 +#define BONUS_STAMINA_DAM 35 +#define BONUS_STUTTER 10 /obj/item/melee/baton/telescopic/contractor_baton /// Ref to the baton holster, should the baton have one. var/obj/item/mod/module/baton_holster/holster /// Bitflags for what upgrades the baton has var/upgrade_flags + /// If the baton lists its upgrades + var/lists_upgrades = TRUE + +/obj/item/melee/baton/telescopic/contractor_baton/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_STORAGE_ENTERED, .proc/storage_undeploy) /obj/item/melee/baton/telescopic/contractor_baton/dropped(mob/user, silent) . = ..() @@ -13,6 +22,16 @@ return holster.undeploy(user) +/obj/item/melee/baton/telescopic/contractor_baton/proc/storage_undeploy(mob/user) + if(!holster) + return + if(!user) + user = holster?.mod?.wearer + var/obj/item/storage = src.loc + var/datum/component/storage/storagecomp = storage.GetComponent(/datum/component/storage) + storagecomp.remove_from_storage(src, get_turf(src)) + holster.undeploy(user) + /obj/item/melee/baton/telescopic/contractor_baton/attack_secondary(mob/living/victim, mob/living/user, params) if(!(upgrade_flags & BATON_CUFF_UPGRADE) || !active) return @@ -26,7 +45,6 @@ var/obj/item/baton_upgrade/upgrade = attacking_item if(!(upgrade_flags & upgrade.upgrade_flag)) upgrade_flags |= upgrade.upgrade_flag - upgrade.desc_update(src) attacking_item.forceMove(src) balloon_alert(user, "[attacking_item] attached") if(!(upgrade_flags & BATON_CUFF_UPGRADE) && !(upgrade_flags & BATON_ALL_UPGRADE)) @@ -52,25 +70,40 @@ /obj/item/melee/baton/telescopic/contractor_baton/additional_effects_non_cyborg(mob/living/carbon/target, mob/living/user) . = ..() - if(!((upgrade_flags & BATON_MUTE_UPGRADE) && !(upgrade_flags & BATON_ALL_UPGRADE))|| !istype(target)) + if(!istype(target)) return - if(target.silent >= (MUTE_CYCLES * 2)) - return - target.silent += MUTE_CYCLES //10 seconds of mute a hit up to 20 max + if((upgrade_flags & BATON_MUTE_UPGRADE) || (upgrade_flags & BATON_ALL_UPGRADE)) + if(target.silent < (MUTE_CYCLES * MUTE_MAX_MOD)) + target.silent = min((target.silent + MUTE_CYCLES), (MUTE_CYCLES * MUTE_MAX_MOD)) + if((upgrade_flags & BATON_FOCUS_UPGRADE) || (upgrade_flags & BATON_ALL_UPGRADE)) + if(target == user.mind?.opposing_force?.contractor_hub?.current_contract?.contract.target?.current) // Pain + target.apply_damage(BONUS_STAMINA_DAM, STAMINA, BODY_ZONE_CHEST) + target.stuttering += BONUS_STUTTER + +/obj/item/melee/baton/telescopic/contractor_baton/examine(mob/user) + . = ..() + if(upgrade_flags && lists_upgrades) + . += "

[span_boldnotice("[src] has the following upgrades attached:")]" + for(var/obj/item/baton_upgrade/upgrade in contents) + . += "
[span_notice("[upgrade].")]" /obj/item/melee/baton/telescopic/contractor_baton/upgraded - upgrade_flags = BATON_ALL_UPGRADE desc = "A compact, specialised baton assigned to Syndicate contractors. Applies light electrical shocks to targets. This one seems to be fully upgraded with unremovable parts." + lists_upgrades = FALSE + upgrade_flags = BATON_ALL_UPGRADE + +/obj/item/melee/baton/telescopic/contractor_baton/upgraded/Initialize(mapload) + . = ..() + for(var/i in 1 to CUFF_MAXIMUM) + new/obj/item/restraints/handcuffs/cable(src) + +/obj/item/melee/baton/telescopic/contractor_baton/upgraded/wrench_act(mob/living/user, obj/item/tool) + return /obj/item/baton_upgrade icon = 'modular_skyrat/modules/contractor/icons/baton_upgrades.dmi' var/upgrade_flag -/obj/item/baton_upgrade/proc/desc_update(obj/item/melee/baton/telescopic/contractor_baton/batong) - if(!batong.upgrade_flags) - desc += "

[span_boldnotice("[batong] has the following upgrades attached:")]" - desc += "
[span_notice("[src].")]" - /obj/item/baton_upgrade/cuff name = "handcuff baton upgrade" desc = "Allows the user to apply restraints to a target via baton, requires to be loaded with up to three prior." @@ -83,5 +116,14 @@ icon_state = "mute_upgrade" upgrade_flag = BATON_MUTE_UPGRADE +/obj/item/baton_upgrade/focus + name = "focus baton upgrade" + desc = "Use of the baton on a target, should they be the subject of your contract, will be extra exhausted." + icon_state = "focus_upgrade" + upgrade_flag = BATON_FOCUS_UPGRADE + #undef CUFF_MAXIMUM #undef MUTE_CYCLES +#undef MUTE_MAX_MOD +#undef BONUS_STAMINA_DAM +#undef BONUS_STUTTER diff --git a/modular_skyrat/modules/contractor/code/items/boxes.dm b/modular_skyrat/modules/contractor/code/items/boxes.dm index 743445f3085..237843a89d4 100644 --- a/modular_skyrat/modules/contractor/code/items/boxes.dm +++ b/modular_skyrat/modules/contractor/code/items/boxes.dm @@ -6,13 +6,6 @@ special_desc_requirement = EXAMINE_CHECK_CONTRACTOR icon_state = "syndiebox" illustration = "writing_syndie" - -/obj/item/storage/box/syndicate/contract_kit/PopulateContents() - new /obj/item/modular_computer/tablet/syndicate_contract_uplink/preset/uplink(src) - new /obj/item/storage/box/syndicate/contractor_loadout(src) - new /obj/item/melee/baton/telescopic/contractor_baton(src) - - // All about 4 TC or less - some nukeops only items, but fit nicely to the theme. var/list/item_list = list( /obj/item/storage/backpack/duffelbag/syndie/x4, /obj/item/storage/box/syndie_kit/throwing_weapons, @@ -27,8 +20,6 @@ /obj/item/clothing/glasses/thermal/syndi, /obj/item/slimepotion/slime/sentience/nuclear, /obj/item/storage/box/syndie_kit/imp_radio, - /obj/item/storage/box/syndie_kit/imp_uplink, - /obj/item/clothing/gloves/krav_maga/combatglovesplus, /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted/riot, /obj/item/reagent_containers/hypospray/medipen/stimulants, /obj/item/storage/box/syndie_kit/imp_freedom, @@ -40,6 +31,12 @@ /obj/item/healthanalyzer/rad_laser ) +/obj/item/storage/box/syndicate/contract_kit/PopulateContents() + new /obj/item/modular_computer/tablet/syndicate_contract_uplink/preset/uplink(src) + new /obj/item/storage/box/syndicate/contractor_loadout(src) + new /obj/item/melee/baton/telescopic/contractor_baton(src) + + // All about 4 TC or less - some nukeops only items, but fit nicely to the theme. for(var/iteration in 1 to SMALL_ITEM_AMOUNT) var/obj/item/small_item = pick_n_take(item_list) new small_item(src) @@ -50,7 +47,7 @@ /obj/item/storage/box/syndicate/contractor_loadout name = "Standard Loadout" special_desc_requirement = EXAMINE_CHECK_CONTRACTOR - special_desc = "Supplied to Syndicate contractors, providing their specialised space suit and chameleon uniform." + special_desc = "Supplied to Syndicate contractors, providing their specialised MODSuit and chameleon uniform." icon_state = "syndiebox" illustration = "writing_syndie" @@ -73,4 +70,23 @@ new /obj/item/extraction_pack/contractor(src) new /obj/item/fulton_core(src) +/obj/item/storage/box/syndicate/contract_kit/midround + name = "Contract Kit" + special_desc = "Supplied to Syndicate contractors." + special_desc_requirement = EXAMINE_CHECK_CONTRACTOR + icon_state = "syndiebox" + illustration = "writing_syndie" + +/obj/item/storage/box/syndicate/contract_kit/midround/PopulateContents() + // All about 4 TC or less - some nukeops only items, but fit nicely to the theme. + for(var/iteration in 1 to SMALL_ITEM_AMOUNT) + var/obj/item/small_item = pick_n_take(item_list) + new small_item(src) + + // Paper guide + new /obj/item/paper/contractor_guide/midround(src) + new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(src) + new /obj/item/lighter(src) + new /obj/item/jammer(src) + #undef SMALL_ITEM_AMOUNT diff --git a/modular_skyrat/modules/contractor/code/items/misc.dm b/modular_skyrat/modules/contractor/code/items/misc.dm index 3c9c19d664e..146545fe6a6 100644 --- a/modular_skyrat/modules/contractor/code/items/misc.dm +++ b/modular_skyrat/modules/contractor/code/items/misc.dm @@ -5,8 +5,8 @@ info = {"

Welcome agent, congratulations on your new position as contractor. On top of your already assigned objectives, this kit will provide you contracts to take on for TC payments.

-

Provided within, we give your specialist contractor space suit. It's even more compact, being able to fit into a pocket, and faster than the - Syndicate space suit available to you on the uplink. We also provide your chameleon jumpsuit and mask, both of which can be changed +

You likely already have your Contractor MODSuit equipped. It has a built in chameleon module, which only works when the MODSuit is undeployed, + but is highly useful for on-station infiltrations. We also provide your chameleon jumpsuit and mask, both of which can be changed to any form you need for the moment. The cigarettes are a special blend - it'll heal your injuries slowly overtime.

Your standard issue contractor baton hits harder than the ones you might be used to, and likely be your go to weapon for kidnapping your @@ -60,3 +60,49 @@ special_desc_requirement = EXAMINE_CHECK_CONTRACTOR special_desc = "A modified fulton pack that can be used indoors thanks to Bluespace technology. Favored by Syndicate Contractors." + +/obj/item/paper/contractor_guide/midround + name = "Contractor Guide" + +/obj/item/paper/contractor_guide/midround/Initialize(mapload) + info = {"

Welcome agent, congratulations on successfully getting in range of the station.

+ +

You likely already have your Contractor MODSuit equipped. It has a built in chameleon module, which only works when the MODSuit is undeployed, + but is highly useful for on-station infiltrations. We also provide your chameleon jumpsuit and mask, both of which can be changed + to any form you need for the moment. The cigarettes are a special blend - it'll heal your injuries slowly overtime.

+ +

Your standard issue contractor baton can be found in the baton holster MODSuit module, it hits harder than the ones you might be used to, + and will likely be your go to weapon for kidnapping your targets. We took the liberty of fully upgrading it beforehand, so don't worry about that. + The three additional items have been randomly selected from what we had available. We hope they're useful to you for your mission.

+ +

The contractor hub, available at the top right of the uplink, will provide you unique items and abilities. These are bought using Contractor Rep, + with two Rep being provided each time you complete a contract.

+ +

Using the tablet

+
    +
  1. Open the Syndicate Contract Uplink program.
  2. +
  3. Here, you can accept a contract, and redeem your TC payments from completed contracts.
  4. +
  5. The payment number shown in brackets is the bonus you'll receive when bringing your target alive. You receive the + other number regardless of if they were alive or dead.
  6. +
  7. Contracts are completed by bringing the target to designated dropoff, calling for extraction, and putting them + inside the pod.
  8. +
+ +

Be careful when accepting a contract. While you'll be able to see the location of the dropoff point, cancelling will make it + unavailable to take on again.

+

The tablet can also be recharged at any cell charger.

+

Extracting

+
    +
  1. Make sure both yourself and your target are at the dropoff.
  2. +
  3. Call the extraction, and stand back from the drop point.
  4. +
  5. If it fails, make sure your target is inside, and there's a free space for the pod to land.
  6. +
  7. Grab your target, and drag them into the pod.
  8. +
+

Ransoms

+

We need your target for our own reasons, but we ransom them back to your mission area once their use is served. They will return back + from where you sent them off from in several minutes time. Don't worry, we give you a cut of what we get paid. We pay this into whatever + ID card you have equipped, on top of the TC payment we give.

+ +

Good luck agent. You can burn this document with the supplied lighter.

"} + + return ..() diff --git a/modular_skyrat/modules/contractor/code/items/modsuit/modsuit.dm b/modular_skyrat/modules/contractor/code/items/modsuit/modsuit.dm index ab6aeebb98a..85513e6b5d2 100644 --- a/modular_skyrat/modules/contractor/code/items/modsuit/modsuit.dm +++ b/modular_skyrat/modules/contractor/code/items/modsuit/modsuit.dm @@ -89,3 +89,7 @@ /obj/item/clothing/shoes/mod/contractor worn_icon = 'modular_skyrat/modules/contractor/icons/worn_modsuit.dmi' icon = 'modular_skyrat/modules/contractor/icons/modsuit.dmi' + +// For the prefs menu +/obj/item/mod/control/pre_equipped/syndicate_empty/contractor + theme = /datum/mod_theme/contractor diff --git a/modular_skyrat/modules/contractor/icons/baton_upgrades.dmi b/modular_skyrat/modules/contractor/icons/baton_upgrades.dmi index 2cde174cb9a..2b7a971dd6c 100644 Binary files a/modular_skyrat/modules/contractor/icons/baton_upgrades.dmi and b/modular_skyrat/modules/contractor/icons/baton_upgrades.dmi differ diff --git a/modular_skyrat/modules/contractor/icons/hud_icon.dmi b/modular_skyrat/modules/contractor/icons/hud_icon.dmi new file mode 100644 index 00000000000..38687134798 Binary files /dev/null and b/modular_skyrat/modules/contractor/icons/hud_icon.dmi differ diff --git a/tgstation.dme b/tgstation.dme index a9bafbc2797..6ec10c45f90 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4804,6 +4804,11 @@ #include "modular_skyrat\modules\contractor\code\datums\contractor_support.dm" #include "modular_skyrat\modules\contractor\code\datums\contractor_tablet.dm" #include "modular_skyrat\modules\contractor\code\datums\mind_datum.dm" +#include "modular_skyrat\modules\contractor\code\datums\midround\antag_datum.dm" +#include "modular_skyrat\modules\contractor\code\datums\midround\event.dm" +#include "modular_skyrat\modules\contractor\code\datums\midround\objective.dm" +#include "modular_skyrat\modules\contractor\code\datums\midround\outfit.dm" +#include "modular_skyrat\modules\contractor\code\datums\midround\trim.dm" #include "modular_skyrat\modules\contractor\code\items\baton.dm" #include "modular_skyrat\modules\contractor\code\items\boxes.dm" #include "modular_skyrat\modules\contractor\code\items\misc.dm" diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/driftingcontractor.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/driftingcontractor.ts new file mode 100644 index 00000000000..a9b952c9a55 --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/driftingcontractor.ts @@ -0,0 +1,21 @@ +import { multiline } from "common/string"; +import { Antagonist, Category } from "../base"; + +export const CONTRACTOR_MECHANICAL_DESCRIPTION + = multiline` + Float onto the station and complete as many + contracts for your employer as you can! + `; + +const DriftingContractor: Antagonist = { + key: "driftingcontractor", + name: "Drifting Contractor", + description: [ + multiline`A Syndicate agent that can spawn near the station, equipped with + top-of-the-line contractor gear, to complete contracts for the Syndicate.`, + CONTRACTOR_MECHANICAL_DESCRIPTION, + ], + category: Category.Midround, +}; + +export default DriftingContractor;