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