M
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
+
+ - Open the Syndicate Contract Uplink program.
+ - Here, you can accept a contract, and redeem your TC payments from completed contracts.
+ - 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.
+ - Contracts are completed by bringing the target to designated dropoff, calling for extraction, and putting them
+ inside the pod.
+
+
+ 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
+
+ - Make sure both yourself and your target are at the dropoff.
+ - Call the extraction, and stand back from the drop point.
+ - If it fails, make sure your target is inside, and there's a free space for the pod to land.
+ - Grab your target, and drag them into the pod.
+
+ 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 2cde174cb9ad5f1c54d7bfdbf9b17dd4a5f4e979..2b7a971dd6c9d16d826875b50c839b826386e860 100644
GIT binary patch
delta 186
zcmaFFw3&H=IG+OxGXn!dgnQ0gAf-4_RbKkQfdl^;jC=BZvw@7ywDLRKnkxV`v>!;GICEoN_9pkoMBu+`JWF~p;D;^U0yKm#7e&4!Gu
zYIL*94%7&|NsAoE`|=d
zirqkQ#*!evU)e_1!5cyiE*d|0q;uX!^CUx2Pwx&3;~?Y9#$F0@9!)wjDMTSy)6#zZ5)H$hD*HV;
zyNy*huaMBlIB|4l*pwNwxe~Rtcl_GfaF&hX(GwXj+dQUOK%3<~T^vIsrY0vaG+z+l
rIJ+ZD)hhXK{2U&hqXornybKH~ZrrO5@J(6{RLbD#>gTe~DWM4fJe^tL
literal 0
HcmV?d00001
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;