diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 97d113d445f..f7cf43e325e 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -455,6 +455,25 @@
sections["shadowling"] = text
+ /** Abductors **/
+
+ text = "Abductor"
+ if(ticker.mode.config_tag == "abductor")
+ text = uppertext(text)
+ text = "[text]: "
+ if(src in ticker.mode.abductors)
+ text += "Abductor|human"
+ text += "|undress|equip"
+ else
+ text += "Abductor|human"
+
+ if(current && current.client && current.client.prefs.be_special & BE_ABDUCTOR)
+ text += "|Enabled in Prefs"
+ else
+ text += "|Disabled in Prefs"
+
+ sections["abductor"] = text
+
/** MONKEY ***/
if (istype(current, /mob/living/carbon))
text = "monkey"
@@ -1074,6 +1093,26 @@
message_admins("[key_name_admin(usr)] has thrall'ed [current].")
log_admin("[key_name(usr)] has thrall'ed [current].")
+ else if(href_list["abductor"])
+ switch(href_list["abductor"])
+ if("clear")
+ usr << "Not implemented yet. Sorry!"
+ if("abductor")
+ if(!ishuman(current))
+ usr << "This only works on humans!"
+ return
+ make_Abductor()
+ log_admin("[key_name(usr)] turned [current] into abductor.")
+ if("equip")
+ var/gear = alert("Agent or Scientist Gear","Gear","Agent","Scientist")
+ if(gear)
+ var/datum/game_mode/abduction/temp = new
+ temp.equip_common(current)
+ if(gear=="Agent")
+ temp.equip_agent(current)
+ else
+ temp.equip_scientist(current)
+
else if (href_list["monkey"])
var/mob/living/L = current
if (L.notransform)
@@ -1349,6 +1388,57 @@
ticker.mode.greet_gang(src)
ticker.mode.equip_gang(current)
+/datum/mind/proc/make_Abductor()
+ var/role = alert("Abductor Role ?","Role","Agent","Scientist")
+ var/team = input("Abductor Team ?","Team ?") in list(1,2,3,4)
+ var/teleport = alert("Teleport to ship ?","Teleport","Yes","No")
+
+ if(!role || !team || !teleport)
+ return
+
+ if(!ishuman(current))
+ return
+
+ ticker.mode.abductors |= src
+
+ var/datum/objective/experiment/O = new
+ O.owner = src
+ objectives += O
+
+ var/mob/living/carbon/human/H = current
+
+ hardset_dna(H,null,null,null,null,/datum/species/abductor,null)
+ var/datum/species/abductor/S = H.dna.species
+
+ switch(role)
+ if("Agent")
+ S.agent = 1
+ if("Scientist")
+ S.scientist = 1
+ S.team = team
+
+ var/list/obj/effect/landmark/abductor/agent_landmarks = new
+ var/list/obj/effect/landmark/abductor/scientist_landmarks = new
+ agent_landmarks.len = 4
+ scientist_landmarks.len = 4
+ for(var/obj/effect/landmark/abductor/A in landmarks_list)
+ if(istype(A,/obj/effect/landmark/abductor/agent))
+ agent_landmarks[text2num(A.team)] = A
+ else if(istype(A,/obj/effect/landmark/abductor/scientist))
+ scientist_landmarks[text2num(A.team)] = A
+
+ var/obj/effect/landmark/L
+ if(teleport=="Yes")
+ switch(role)
+ if("Agent")
+ S.agent = 1
+ L = agent_landmarks[team]
+ H.loc = L.loc
+ if("Scientist")
+ S.scientist = 1
+ L = agent_landmarks[team]
+ H.loc = L.loc
+
/datum/mind/proc/AddSpell(var/obj/effect/proc_holder/spell/spell)
diff --git a/code/game/gamemodes/abduction/abduction.dm b/code/game/gamemodes/abduction/abduction.dm
index 5322e70f9c2..f4d2c8efb47 100644
--- a/code/game/gamemodes/abduction/abduction.dm
+++ b/code/game/gamemodes/abduction/abduction.dm
@@ -223,6 +223,10 @@
return console
/datum/game_mode/abduction/proc/equip_agent(var/mob/living/carbon/human/agent,var/team_number)
+ if(!team_number)
+ var/datum/species/abductor/S = agent.dna.species
+ team_number = S.team
+
var/obj/machinery/abductor/console/console = get_team_console(team_number)
var/obj/item/clothing/suit/armor/abductor/vest/V = new /obj/item/clothing/suit/armor/abductor/vest(agent)
if(console!=null)
@@ -236,6 +240,10 @@
/datum/game_mode/abduction/proc/equip_scientist(var/mob/living/carbon/human/scientist,var/team_number)
+ if(!team_number)
+ var/datum/species/abductor/S = scientist.dna.species
+ team_number = S.team
+
var/obj/machinery/abductor/console/console = get_team_console(team_number)
var/obj/item/device/abductor/gizmo/G = new /obj/item/device/abductor/gizmo(scientist)
if(console!=null)
@@ -259,6 +267,7 @@
return ..()
/datum/game_mode/abduction/declare_completion()
+ world << "
The Abductors were:"
for(var/team_number=1,team_number<=teams,team_number++)
var/obj/machinery/abductor/console/console = get_team_console(team_number)
var/datum/objective/objective = team_objectives[team_number]
@@ -274,7 +283,7 @@
world << "[team_name] team failed its mission! "
world << "Team Members: [agent.name]([agent.ckey])
[scientist.name]([scientist.ckey])"
- world << "Abductees:"
+ world << "
The Abductees were:"
display_abductees(console)
..()
@@ -285,20 +294,24 @@
for(var/mob/living/abductee in abductees)
if(!abductee.mind)
continue
- world << "[abductee.name]([abductee.ckey]))"
- var/count = 1
- for(var/datum/objective/objective in abductee.mind.objectives)
- if(objective.check_completion())
- world << "
Objective #[count]: [objective.explanation_text] Success!"
- else
- world << "
Objective #[count]: [objective.explanation_text] Fail."
- count++
+ world << printplayer(abductee.mind)
+ world << printobjectives(abductee.mind)
/datum/game_mode/proc/auto_declare_completion_abduction()
if(abductors.len)
- world << "Abductors:"
+ world << "
The Abductors were:"
for(var/datum/mind/M in abductors)
world << "Abductor [M.current ? M.current.name : "Abductor"]([M.key])"
+ world << printobjectives(M)
+ world << "
The Abductees were:"
+ var/list/full_history = list()
+ for(var/obj/machinery/abductor/console/C in machines)
+ full_history |= C.experiment.history
+ for(var/mob/living/abductee in full_history)
+ if(!abductee.mind)
+ continue
+ world << printplayer(abductee.mind)
+ world << printobjectives(abductee.mind)
return
//Landmarks
@@ -329,6 +342,19 @@ datum/objective/experiment/New()
explanation_text = "Experiment on [target_amount] humans"
datum/objective/experiment/check_completion()
+ if(!owner.current || !ishuman(owner.current))
+ return 0
+ var/mob/living/carbon/human/H = owner.current
+ if(!H.dna || !H.dna.species || !(H.dna.species.id == "abductor"))
+ return 0
+ var/datum/species/abductor/S = H.dna.species
+ var/ab_team = S.team
+ for(var/obj/machinery/abductor/experiment/E in machines)
+ if(E.team == ab_team)
+ if(E.points >= target_amount)
+ return 1
+ else
+ return 0
return 0
datum/objective/abductee
diff --git a/code/game/gamemodes/abduction/abduction_gear.dm b/code/game/gamemodes/abduction/abduction_gear.dm
index 0b8b72cb227..a13b347907c 100644
--- a/code/game/gamemodes/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/abduction/abduction_gear.dm
@@ -11,6 +11,7 @@
icon_state = "vest_stealth"
item_state = "armor"
blood_overlay_type = "armor"
+ origin_tech = "materials=5;biotech=4;powerstorage=5"
armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15)
action_button_name = "Activate"
action_button_is_hands_free = 1
@@ -147,6 +148,7 @@
icon = 'icons/obj/abductor.dmi'
icon_state = "gizmo_scan"
item_state = "silencer"
+ origin_tech = "materials=5;magnets=5;bluespace=6"
var/mode = GIZMO_SCAN
var/mob/living/marked = null
var/obj/machinery/abductor/console/console
@@ -208,6 +210,8 @@
user << "You mark the target for future retrieval."
else
prepare(target,user)
+ else
+ prepare(target,user)
/obj/item/device/abductor/gizmo/proc/prepare(var/atom/target, var/mob/living/user)
if(get_dist(target,user)>1)
@@ -225,6 +229,7 @@
icon = 'icons/obj/abductor.dmi'
icon_state = "silencer"
item_state = "gizmo"
+ origin_tech = "materials=5;magnets=5"
/obj/item/device/abductor/silencer/attack(mob/living/M, mob/user)
if(!AbductorCheck(user))
@@ -246,6 +251,8 @@
var/mob/living/carbon/human/M
for(M in view(2,targloc))
+ if(M == user)
+ continue
user << "You silence [M.name] radio devices."
radio_off_mob(M)
@@ -327,7 +334,8 @@ Congratulations! You are now trained for xenobiology research!"}
#define BATON_STUN 0
#define BATON_SLEEP 1
#define BATON_CUFF 2
-#define BATON_MODES 3
+#define BATON_PROBE 3
+#define BATON_MODES 4
/obj/item/weapon/abductor_baton
name = "Advanced Baton"
@@ -336,6 +344,7 @@ Congratulations! You are now trained for xenobiology research!"}
icon_state = "wonderprod"
item_state = "wonderprod"
slot_flags = SLOT_BELT
+ origin_tech = "materials=6;combat=5;biotech=7"
force = 7
w_class = 3
action_button_name = "Toggle Mode"
@@ -350,6 +359,8 @@ Congratulations! You are now trained for xenobiology research!"}
txt = "sleep inducment"
if(BATON_CUFF)
txt = "restraining"
+ if(BATON_PROBE)
+ txt = "probing"
usr << "You switch the baton to [txt] mode"
update_icon()
@@ -362,6 +373,8 @@ Congratulations! You are now trained for xenobiology research!"}
icon_state = "wonderprod"
if(BATON_CUFF)
icon_state = "wonderprod"
+ if(BATON_PROBE)
+ icon_state = "wonderprod"
/obj/item/weapon/abductor_baton/proc/IsAbductor(var/mob/living/user)
if(!ishuman(user))
@@ -384,11 +397,6 @@ Congratulations! You are now trained for xenobiology research!"}
if(!isliving(target))
return
- if(user.a_intent == "help")
- target.visible_message("[user] probes [target] with [src]!", \
- "[user] probed [target]!")
- return
-
var/mob/living/L = target
user.do_attack_animation(L)
@@ -399,6 +407,8 @@ Congratulations! You are now trained for xenobiology research!"}
SleepAttack(L,user)
if(BATON_CUFF)
CuffAttack(L,user)
+ if(BATON_PROBE)
+ ProbeAttack(L,user)
/obj/item/weapon/abductor_baton/attack_self(mob/living/user)
toggle(user)
@@ -450,6 +460,19 @@ Congratulations! You are now trained for xenobiology research!"}
user << "You fail to handcuff [C]."
return
+/obj/item/weapon/abductor_baton/proc/ProbeAttack(mob/living/L,mob/living/user)
+ L.visible_message("[user] probes [L] with [src]!", \
+ "[user] probed [L]!")
+
+ var/species = "Unknown Species"
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ if(H.dna && H.dna.species)
+ species = "[H.dna.species.name]"
+ if(L.mind && L.mind.changeling)
+ species = "Changeling Lifeform"
+ user << "Probing Result:[species]"
+
/obj/item/weapon/restraints/handcuffs/energy
name = "energy cuffs"
desc = "Energy field restraining the hands."
@@ -505,10 +528,11 @@ Congratulations! You are now trained for xenobiology research!"}
/obj/item/clothing/head/helmet/abductor
name = "Agent Headgear"
- desc = "Abducting with style. Spiky style."
+ desc = "Abducting with style. Spiky style. Prevents digital tracking."
icon_state = "alienhelmet"
item_state = "alienhelmet"
blockTracking = 1
+ origin_tech = "materials=6;magnets=5"
// Operating Table / Beds / Lockers
diff --git a/code/game/gamemodes/abduction/machinery/console.dm b/code/game/gamemodes/abduction/machinery/console.dm
index bfaeefa3e2c..89f37c05ccf 100644
--- a/code/game/gamemodes/abduction/machinery/console.dm
+++ b/code/game/gamemodes/abduction/machinery/console.dm
@@ -51,6 +51,11 @@
if(experiment != null)
var/points = experiment.points
dat += "Collected Samples : [points]
"
+ dat += "Transfer data in exchange for supplies:
"
+ dat += "Advanced Baton
"
+ dat += "Agent Helmet
"
+ dat += "Radio Silencer
"
+ dat += "Science Tool
"
else
dat += "NO EXPERIMENT MACHINE DETECTED
"
@@ -101,6 +106,16 @@
FlipVest()
else if(href_list["select_disguise"])
SelectDisguise()
+ else if(href_list["dispense"])
+ switch(href_list["dispense"])
+ if("baton")
+ Dispense(/obj/item/weapon/abductor_baton,cost=2)
+ if("helmet")
+ Dispense(/obj/item/clothing/head/helmet/abductor)
+ if("silencer")
+ Dispense(/obj/item/device/abductor/silencer)
+ if("tool")
+ Dispense(/obj/item/device/abductor/gizmo)
src.updateUsrDialog()
/obj/machinery/abductor/console/proc/TeleporterSet()
@@ -181,4 +196,17 @@
user << "You link the vest to the console."
vest = V
else
- ..()
\ No newline at end of file
+ ..()
+
+/obj/machinery/abductor/console/proc/Dispense(var/item,var/cost=1)
+ if(experiment && experiment.points >= cost)
+ experiment.points-=cost
+ say("Incoming supply!")
+ if(pad)
+ flick("alien-pad", pad)
+ new item(pad.loc)
+ else
+ new item(src.loc)
+ else
+ say("Insufficent data!")
+ return
\ No newline at end of file
diff --git a/code/game/gamemodes/abduction/machinery/pad.dm b/code/game/gamemodes/abduction/machinery/pad.dm
index 081f746a085..b586874397d 100644
--- a/code/game/gamemodes/abduction/machinery/pad.dm
+++ b/code/game/gamemodes/abduction/machinery/pad.dm
@@ -49,7 +49,7 @@
spawn(0)
anim(target.loc,target,'icons/mob/mob.dmi',,"uncloak",,target.dir)
-/obj/machinery/abductor/pad/proc/Retrieve(var/mob/living/carbon/human/target)
+/obj/machinery/abductor/pad/proc/Retrieve(var/mob/living/target)
flick("alien-pad", src)
spawn(0)
anim(target.loc,target,'icons/mob/mob.dmi',,"uncloak",,target.dir)
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 1dea0f2834d..83c10f02e99 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -487,6 +487,17 @@ proc/display_roundstart_logout_report()
return text
+/datum/game_mode/proc/printobjectives(var/datum/mind/ply)
+ var/text = ""
+ var/count = 1
+ for(var/datum/objective/objective in ply.objectives)
+ if(objective.check_completion())
+ text += "
Objective #[count]: [objective.explanation_text] Success!"
+ else
+ text += "
Objective #[count]: [objective.explanation_text] Fail."
+ count++
+ return text
+
//If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1
/datum/game_mode/proc/age_check(client/C)
if(get_remaining_days(C) == 0)
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index 3e0dac86a35..dd7eb081ded 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -73,11 +73,10 @@
//Cameras can't track people wearing an agent card or a ninja hood.
if(H.wear_id && istype(H.wear_id.GetID(), /obj/item/weapon/card/id/syndicate))
continue
- //Generic variable who's existance is to blame on shitty old ninja code
- if(istype(H.head, /obj/item/clothing/head))
- var/obj/item/clothing/head/hat = H.head
- if(hat.blockTracking)
- continue
+ if(istype(H.head, /obj/item/clothing/head))
+ var/obj/item/clothing/head/hat = H.head
+ if(hat.blockTracking)
+ continue
// Now, are they viewable by a camera? (This is last because it's the most intensive check)
if(!near_camera(M))
@@ -130,10 +129,10 @@
U << "Follow camera mode terminated."
U.cameraFollow = null
return
- if(istype(H.head, /obj/item/clothing/head))
- var/obj/item/clothing/head/hat = H.head
- if(hat.blockTracking)
- U << "Follow camera mode terminated."
+ if(istype(H.head, /obj/item/clothing/head))
+ var/obj/item/clothing/head/hat = H.head
+ if(hat.blockTracking)
+ U << "Follow camera mode terminated."
U.cameraFollow = null
return
if(H.digitalcamo)
@@ -194,4 +193,4 @@
else
if (sorttext(a.c_tag, b.c_tag) < 0)
L.Swap(j, j + 1)
- return L
\ No newline at end of file
+ return L
diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm
index a2a98f734a8..e6d3be6adfe 100644
--- a/code/game/turfs/unsimulated/floor.dm
+++ b/code/game/turfs/unsimulated/floor.dm
@@ -25,3 +25,7 @@
/turf/unsimulated/floor/abductor
name = "alien floor"
icon_state = "alienpod1"
+
+/turf/unsimulated/floor/abductor/New()
+ ..()
+ icon_state = "alienpod[rand(1,9)]"
diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm
index 031dd047d56..042832894d7 100644
--- a/code/modules/surgery/surgery_step.dm
+++ b/code/modules/surgery/surgery_step.dm
@@ -25,7 +25,7 @@
if(success)
if(target_zone == surgery.location)
- if(get_location_accessible(target, target_zone))
+ if(get_location_accessible(target, target_zone) || surgery.ignore_clothes)
initiate(user, target, target_zone, tool, surgery)
return 1
else
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index ccdac8d866d..682103c7dcb 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index dc66c1ec6dd..1d42d7752c2 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ